popen()

Исполнить команду, создав однонаправленный канал

Прототип:

#include <stdio.h>
FILE * popen( const char *command,
const char *mode );

Аргументы:

command
Команда, которую необходимо выполнить.
mode
Режим ввода-вывода для канала "r" или "w".

Библиотека:

libc

Описание:

Функция popen() выполняет команду, указанную в аргументе command, и создает однонаправленный канал между вызывающим процессом и выполненной командой.

В зависимости от аргумента режима mode вы можете использовать возвращаемый указатель потока для чтения или записи в канал.

У исполняемой команды такое же окружение, что и у ее родителя. Команда запускается следующим образом:

spawnlp( P_NOWAIT, shell_command, shell_command, "-c", command, (char* )NULL );

где shell_command - это команда, заданная переменной среды SHELL (если она существует) или утилитой sh.

Аргумент режима mode для функции popen() - это строка, которая определяет режим ввода-вывода для канала:


Note: Используйте pclose() чтобы закрыть поток, который вы открыли с помощью popen().

Возвращаемое значение:

Указатель потока не имеющий значения NULL при успешном завершении. Если popen() не может создать ни канал, ни дочерний процесс, он возвращает указатель потока со значением NULL и устанавливает errno.

Коды ошибок:

EINVAL
Аргумент mode имеет недопустимое значение.
ENOSYS
Менеджер каналов pipe не найден.

Функция popen() может также устанавливать значения errno, как описано функциями pipe() и spawnl().

Примеры:

/*
* upper: executes a given program, converting all input
* to upper case.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <limits.h>
char buffer[_POSIX_ARG_MAX];
int main( int argc, char** argv )
{
int i;
int c;
FILE *f;
for ( i = 1; i < argc; i++ )
{
strcat( buffer, argv[i] );
strcat( buffer, " " );
}
if ( (f = popen( buffer, "w" )) == NULL )
{
perror( "popen" );
return (EXIT_FAILURE);
}
while ( (c = getchar()) != EOF )
{
if ( islower( c ) )
c = toupper( c );
putc( c, f );
}
pclose( f );
return (EXIT_SUCCESS);
}

Классификация:

POSIX 1003.1

Безопасность использования
Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Нет

Тематические ссылки:

errno, pclose(), pipe(), spawnlp()




Предыдущий раздел: Описание API системной библиотеки