Связь со скриптом из программы на C ++ - PullRequest
1 голос
/ 14 декабря 2010

У меня есть программа на С ++ (очень сложная и длительная как по коду, так и по времени выполнения). Время от времени эта программа останавливается и вызывает пользовательский сценарий оболочки.

Перед вызовом скрипта моя программа создает файл .out с текущими данными. Я вызываю скрипт с помощью команды system(). Затем скрипт читает файл .out, создает собственный файл script.out и завершает работу.

Затем вызов функции system() заканчивается, и моя программа читает и анализирует файл script.out.

Вопрос : есть ли лучший способ выполнить связь между моей программой на С ++ и сценарием произвольной оболочки?

Мое намерение - иметь полное общение между ними. Сценарий может практически «спросить» программу «Какие данные у вас есть сейчас?» и программа ответит со строгим соглашением. Тогда скрипт может сказать «Добавить эти данные ...» или «удалить все ваши предыдущие данные» и т. Д. И т. Д.

Причина, по которой я нуждаюсь в этом, заключается в том, что сценарий оболочки говорит программе изменить свои данные. Точные данные, которые были помещены в исходный файл .out. Таким образом, после внесения изменений фактические данные, хранящиеся в программе, не соответствуют данным, записанным в файле .out.

Спасибо!

P.S. Клянусь, я искал вокруг, но все предлагают промежуточный файл.

Ответы [ 4 ]

3 голосов
/ 14 декабря 2010

Конечно, есть способы сделать это без промежуточных файлов. Наиболее распространенным подходом является использование аргументов командной строки для ввода и каналов для стандартного вывода; другие также используют трубы для ввода. Тогда наиболее простой альтернативой system является использование popen.

1 голос
/ 14 декабря 2010

В Unix-подобной системе? Возможно, pipe (2) будет работать для вас?

Со страницы руководства (версия для Mac OS X 10.5):

СИНТАКСИС
#include

int pipe(int fildes[2]);

ОПИСАНИЕ
Функция pipe () создает канал (объект, который позволяет однонаправленным поток данных) и выделяет пару файловых дескрипторов. Первое описание тор соединяется с читаемым концом канала; второй соединяется с конец записи.

Вам, конечно, придется следить за созданием каналов с парой fork и exec. Возможно, на это уже подробно ответили, и теперь вы знаете, что искать ...


Прошло много времени с тех пор, как я это сделал, но:

  • В основном процессе, перед тем как разветвить подпроцесс, вы дважды вызываете pipe. Теперь у вас есть две трубы и контролируйте оба конца обоих.
  • Вы вилка.
    • Основной процесс будет читать из одного канала и писать из другого. Неважно, что есть что, но вам нужно прояснить это.
    • Дочерний процесс вызовет одну из функций семейства exec, чтобы заменить его изображение на изображение оболочки, которую вы хотите запустить , но сначала вы будете использовать dup2 для замены стандартного ввода и вывод с концами двух труб (опять же, здесь вам нужно уточнить, какая трубка какая).

В этот момент у вас есть два процесса, основной процесс может отправлять вещи в один канал, и они будут получены на стандартном входе скрипта, и все, что скрипт записывает в свой стандартный вывод, будет отправляться в другой канал. контролирующий процесс. Таким образом, они сменяются, как при взаимодействии с оболочкой.

0 голосов
/ 14 декабря 2010

Вы задаете вопрос о межпроцессном взаимодействии (IPC).

Есть много способов сделать это.Вы можете просто выполнить поиск, и Интернет вернет вам большинство ответов.

Если я не ошибаюсь, Google Chrome использует метод под названием Named Pipe."это, вероятно, файл.Но если вы знаете, что работаете с какой операционной системой, вы определенно можете использовать большинство методов IPC.

0 голосов
/ 14 декабря 2010

Вы можете использовать каналы или (возможно, более удобные) сокеты - например, интерфейсы для gdb, или ожидайте, что сделайте это.Это потребовало бы изменений в ваших сценариях оболочки и перехода с system() на более низкоуровневые fork() и exec().

Это довольно сложно, поэтому, пожалуйста, будьте более конкретны в отношении вашей среды и того, что вам нужноуточнить.

...