Информация об изменениях

Сообщение Re: Выполнить приложение. Параметры в поток ввода, результат от 22.07.2015 12:36

Изменено 22.07.2015 12:37 vsb

Здравствуйте, dosik, Вы писали:

D>Добрый день.


D>Осваиваюсь в *nix (ранее писал только под Windows) системах.

D>Возникла следующая задача: необходимо выполнить из своей программы внешнюю программу таким образом, чтобы в ее поток ввода передать ей некие значения, а результат ее работы получить из ее потока вывода и отобразить результаты внутри своей программы.
D>С начала смотрел в сторону exec*, но там немного не то.
D>Язык — С++.
D>Заранее благодарен.

1. Создаёте два (или три, если нужен stderr) пайпа вызовом pipe().

2. Делаете вызов fork();

3. В дочерней программе делаете dup2(stdinpipe[0], 0), т.е. стандартный ввод заменяете этим пайпом. То же самое делаете со стандартным выводом (1), если нужно — со стандартным выводом ошибок. Закрываете старые дескрипторы pipe. Не перепутайте порядок дескрипторов, с stdin ваша программа будет читать, в stdout писать.

4. В дочерней программе делаете exec в нужную вам программу.

5. В родительской программе закрываете те дескрипторы pipe, которые используются дочерней программой.

В принципе всё. В родительской программе пишете в оставшиеся дескрипторы, читаете из них и тд.

Главное вдумчиво почитать man-ы по всем используемым функциям. Ничего сложного, на самом деле.

Раз у вас C++, можете навернуть абстракций над всем этим или какой-нибудь, прости господи, буст заюзать. Там наверное всё это под капотом спрятано. Но вообще это делается вот так.
Re: Выполнить приложение. Параметры в поток ввода, результат
Здравствуйте, dosik, Вы писали:

D>Добрый день.


D>Осваиваюсь в *nix (ранее писал только под Windows) системах.

D>Возникла следующая задача: необходимо выполнить из своей программы внешнюю программу таким образом, чтобы в ее поток ввода передать ей некие значения, а результат ее работы получить из ее потока вывода и отобразить результаты внутри своей программы.
D>С начала смотрел в сторону exec*, но там немного не то.
D>Язык — С++.
D>Заранее благодарен.

1. Создаёте два (или три, если нужен stderr) пайпа вызовом pipe().

2. Делаете вызов fork();

3. В дочерней программе делаете dup2(stdinpipe[0], 0), т.е. стандартный ввод заменяете этим пайпом. То же самое делаете со стандартным выводом (1), если нужно — со стандартным выводом ошибок. Закрываете все дескрипторы pipe. Не перепутайте порядок дескрипторов, с stdin ваша программа будет читать, в stdout писать.

4. В дочерней программе делаете exec в нужную вам программу.

5. В родительской программе закрываете те дескрипторы pipe, которые используются дочерней программой.

В принципе всё. В родительской программе пишете в оставшиеся дескрипторы, читаете из них и тд.

Главное вдумчиво почитать man-ы по всем используемым функциям. Ничего сложного, на самом деле.

Раз у вас C++, можете навернуть абстракций над всем этим или какой-нибудь, прости господи, буст заюзать. Там наверное всё это под капотом спрятано. Но вообще это делается вот так.