popen, pclose - создание и ликвидация канала между программой и командой
#include <stdio.h>
FILE *popen (command, type) char *command, *type;
int pclose (stream) FILE *stream;
Аргументами функции popen являются указатели на цепочки символов с завершающим нулевым байтом. Первая из них, command, содержит команду shell'а, а вторая задает режим ввода/вывода: "r" для чтения и "w" для записи. Функция popen создает канал между вызывающей программой и указанной командой. Возвращаемое значение - это указатель на поток. Если режим равен "w", то можно писать на стандартный ввод команды, выводя в созданный поток. Если режим равен "r", то можно читать со стандартного вывода команды, вводя из созданного потока.
Поток, открытый с помощью popen, должен быть закрыт с помощью функции pclose, которая ожидает завершения запущенного процесса выполнения команды и выдает код его завершения.
Поскольку открытые файлы разделяются, команда с режимом "r" может быть использована как входной фильтр, а команда с режимом "w" - как выходной фильтр.
char *cmd = "ls *.c"; FILE *ptr; if ((ptr = popen (cmd, "r")) != NULL) while (fgets (buf, n, ptr)) != NULL) (void) printf ("%s", buf);
На стандартный вывод будут записаны имена всех файлов с расширением .c, принадлежащих текущему каталогу.
, , , , , .
Функция popen возвращает пустой указатель (NULL), если файл или процесс не могут быть созданы.
Функция pclose возвращает -1, если поток не ассоциирован с командой посредством popen.
Если требуется, чтобы вызывающий процесс и процесс, порождаемый по popen, одновременно читали или писали в общие файлы, то нельзя при этом пользоваться буферизованным вводом/выводом, так как данные в буферах перемешаются непредсказуемо. Проблемы с выходным фильтром могут быть решены путем аккуратного выталкивания буферов с помощью функции fflush [см. ].