LINUX.ORG.RU

Перехват сообщения bash-скрипта в программе С++

 , , перехват сообщений


1

2

Доброе время суток, собратья кодеры! =) Не знаю как по-человечески объяснить, так что начну сначала. Система Linux-подобная, язык С++. Меня часто просят через консоль сделаеть кое-что с базами в Postgres. Это «кое-что» разнообразием не отличается и сами команды отличаются 2-3 параметрами. Для самих юзеров консоль - инопланетные технологии, да и упаси Боже чего не так сделают, так что появилась идея сделать для них приложение. Типа «два клика» и всё сами сделали. СУБД это не позволяет. А, если и позволяет, то ставить им целое СУБД, когда им всего навсего нужно 2-3 возможности?.. Лучше предоставить им только то, что необходимо и ни одной возможностью больше =) Итак, как из С++ программы выполнить bash-скрипт я разобралась: system («команда на bash-скрипте»); Загвоздка в перехвате сообщений. Т.е. не знаю как это сделать. Я ни разу ничего не перехватывала. Сейчас моя прога просто посылает команду на bash'е, а выполнилась она или нет... фиг его знает, ибо связь одностороняя, т.е. я ничего в ответ не получаю (судя по тому, что необходимые файлы создаются, прога работает). А как получить? Не говоря уже о том, что программа завершается раньше, чем этот скрипт выполнится =))) Знаю, знаю, нужно сказать программе: «жди». При выполнении этой же команды в консоли, я получаю в ответ разного рода текст, вот и мне нужно его получить для своей обработки. Идея была в том, чтобы, помимо кнопочек для пользователя, сделать себе маленькое консоль-окошко в программе. Знаете как при установки Убунты есть внизу консоль только для чтения? Вот типа её и тоже ТОЛЬКО ДЛЯ ЧТЕНИЯ + обрабатывать этот текст. Сразу хочу сказать, что с bash'ем и Линуксом я не сильно знакома, хотя и был опыт, но небольшой. Буду благодарна за любую помощь в этом деле.


man system
Он возвращает значение, с которым завершился скрипт.

Для получения текстового вывода - используй потоки и перехватывай вывод потока с командой в основном потоке.

P.S. Возможно для данной задачи лучше использовать не скрипты, а SQL-запросы из C++ кода.

trex6 ★★★★★
()

Для postgres есть C API, как и для любых СУБД. Используй его.

O02eg ★★★★★
()

Сублимирую для тех, кому лень читать:
Как в С++ перехватить выхлоп от system («foo bar»);?

PS: мне просто было скучно, решил осилить этот рассказ.

Spirit_of_Stallman ★★★
()
Ответ на: комментарий от trex6

Не думаю что SQL для этого сгодится, ибо там, например, нужно снять все данные с базы в sql-скрипт, причём не все таблицы, потом снести базу, создать базу, накатить данные на базу. Это при изменении схемы базы, например. У нас на работе отлажен этот процесс в bash-скриптах, но избавляться от них нежелательно (долго уговаривать начальство).

Спасибо, попробую с потоками.

MargoK
() автор топика

собратья кодеры!

Не брат я тебе, <дальше сам продолжи>. system() возвращает код завершения команды (тут man 2 wait). Если нужна ещё обработка выхлопа, то man popen.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от MargoK

снять все данные с базы в sql-скрипт, причём не все таблицы, потом снести базу, создать базу, накатить данные на базу

Вот все это как раз отлично реализуется через SQL, но если есть уже работающее и проверенное решение, то лучше использовать его.

Старый костыль лучше новых двух!

trex6 ★★★★★
()
Ответ на: комментарий от v9lij

Тоесть? :)
Вас смущают женщины?
Или женщины программеры? (опустим тут уровень знаний конкретного индивида, таких же самцов найду 3 ведра и бидончик, за пару часов)

Spirit_of_Stallman ★★★
()
Ответ на: комментарий от MargoK

Если вам интересно моё мнение, я скажу что вы излишне эмоциональны и это заставляет воспринимать вас, даже не как молодого технического специалиста.
Научитесь избавляться от лишнего.
Пример - моё первое тут сообщение (ваш рассказ можно выразить строчкой до 10ти слов).

Ну и таки не воспринимайте всё так близко к сердцу.
Интернет злая штука, быстро сгорите :)

Spirit_of_Stallman ★★★
()
Ответ на: комментарий от Spirit_of_Stallman

Скорее персонажи на ЛОРе, которые просят решить простую задачу и при этом выдают себя за женщин.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

и при этом выдают себя за женщин

Ну... я умалчиваю, когда откровенно вижу подобную игру (давно уже увлекаюсь речевым анализом). Не всегда это на 100% так же может оказаться, но таки очень заметно.
Мне интересней сыграть в эту игру, и попробовать проследить профит мимикриста и реакции масс.

Spirit_of_Stallman ★★★
()
Ответ на: комментарий от MargoK

Мне не нравится ТС и его коллеги.

anonymous
()

Можно напрямую дёргать апи postgres, а так есть пайпы.

mix_mix ★★★★★
()

man QProcess

Заодно можно и копочек для пользователей накидать...

solovey ★★
()

Не совсем понимаю зачем для этого писать прогу на C++. Может конечно я не совсем понял задачу? Я такие задачи делал следующим образом - создавал юзверятам веб-морду и клал ее на апачу на сервак, которая в свою очередь стартовала на серваке bash/perl скрипты. Апач не обязательно должен быть на том же серваке что и PostgreSQL. Ответ можно отпарсить тем же bash или perl и в удобоваримой юзверятам форме выплюнуть обратно в веб. Веб морду делал на html/php/javascript. Как то так.

bearpuh
()
Ответ на: комментарий от bearpuh

Не совсем понимаю зачем для этого писать прогу на C++

Затем, что человек более-менее знаком с инструментом. Да и городить сервак для такой задачи - явный оверхед.

trex6 ★★★★★
()
Ответ на: комментарий от MargoK

Таки думаю, что не гей, а просто пидарас.

anonymous
()
Ответ на: комментарий от trex6

Предполагается, что вэб сервак имеется. Но возможно Вы и правы. Хотя если крутится PostgreSQL и явно на линухах, то апачу поставить минут 5 займет времени. Вообще, стараюсь делать вэб приложения - кроссплатформенность и с любого девайса мона, включая планшеты и мобилы.

bearpuh
()
Ответ на: комментарий от bearpuh

C++/Qt так же дает широкий выбор платформ, но с вебом, конечно, не сравнится. А сервак кроме того что поставить, так его еще и сопровождать надо. Опять же с настройкой авторизации можно накосячить.

trex6 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.