Как я могу захватить вывод другого процесса, используя C? - PullRequest
4 голосов
/ 15 марта 2009

Как я могу захватить вывод другого процесса, используя чистый C? Можете ли вы предоставить пример кода?

РЕДАКТИРОВАТЬ: давайте предположим, Linux. Я был бы заинтересован в "довольно портативном" коде. Все, что я хочу сделать, это выполнить команду, записать ее вывод и каким-то образом обработать ее.

Ответы [ 3 ]

5 голосов
/ 15 марта 2009

Есть несколько вариантов, но это зависит от вашей платформы. При этом popen должно работать в большинстве мест, например

#include <stdio.h>

FILE *stream;
stream = popen("acommand", "r");

/* use fread, fgets, etc. on stream */

pclose(stream);

Обратите внимание, что это имеет очень специфическое использование, он создает процесс, выполняя команду acommand и присоединяет его стандарт таким образом, чтобы сделать его доступным из вашей программы через поток FILE*.

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

В окнах вы можете использовать API CreateProcess, чтобы создать новый процесс и подключить его стандартный дескриптор вывода к тому, что вы хотите. Windows также поддерживает popen.

Хотя я не знаю простого C-способа сделать это, поэтому он всегда зависит от платформы APis.

Исходя из ваших правок popen кажется идеальным, он "довольно переносимый", я не думаю, что есть UNIX-подобная ОС без него, действительно, это часть спецификации Single Unix и POSIX и позволяет вам делать именно то, что вы хотите, выполнить процесс, получить его вывод и обработать его.

3 голосов
/ 15 марта 2009

Если вы можете использовать системные каналы, просто передайте выходные данные другого процесса в вашу C-программу, а в вашей C-программе просто прочитайте стандартный ввод.

otherprocess | your_c_program
0 голосов
/ 15 марта 2009

Какую ОС вы используете? В ОС * nix типа, если ваш процесс выводит данные в STDOUT или STDERR, вы, очевидно, можете использовать каналы

...