Unix Man (Справочное руководство)

         

POPEN(3S)


POPEN(3S)

НАЗВАНИЕ


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 [см. ].



    Содержание раздела