Исполнить команду, создав однонаправленный канал
#include <stdio.h>FILE * popen( const char *command,const char *mode );
libc
Функция popen() выполняет команду, указанную в аргументе command, и создает однонаправленный канал между вызывающим процессом и выполненной командой.
В зависимости от аргумента режима mode вы можете использовать возвращаемый указатель потока для чтения или записи в канал.
У исполняемой команды такое же окружение, что и у ее родителя. Команда запускается следующим образом:
spawnlp( P_NOWAIT, shell_command, shell_command, "-c", command, (char* )NULL );
где shell_command - это команда, заданная переменной среды SHELL
(если она существует) или утилитой sh.
Аргумент режима mode для функции popen() - это строка, которая определяет режим ввода-вывода для канала:
STDOUT_FILENO
, является концом канала с возможностью записи в него. STDIN_FILENO
, является концом канала с возможностью чтения из него.
Указатель потока не имеющий значения NULL
при успешном завершении. Если popen() не может создать ни канал, ни дочерний процесс, он возвращает указатель потока со значением NULL
и устанавливает errno.
Функция 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 системной библиотеки