POPEN(3)

NOME
popen, pclose - processos de E/S

SINÓPSE
#include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);

DESCRIÇÃO
A função popen() abre o processo criando um duto nomeado (pipe), fazendo um 'fork' e chamando um interpretador de comandos. Como o duto é por definição unidirecional, o type do argumento deve especificar somente leitura ou escrita, e não ambas; o fluxo resultante é correspondente a somente leitura ou somente gravação.

O argumento command é um ponteiro para uma cadeia de caracteres terminada em NULL contendo uma linha de comando do interpretador. Esse comando é passado ao /bin/sh usando a interpretação do sinalizador -c, que se existir, será executado. O argumento mode é um ponteiro para uma cadeia de caracteres terminada em NULL que deve conter 'r' para leitura ou 'w' para a escrita.

O valor do resultado de popen() é um fluxo padrão de E/S e em todas as situações deve ser fechada com pclose() ao invés de fclose(). Ao usar um fluxo que escreve com a entrada padrão de comando, a sua saída padrão é a mesma do processo que chamou popen(), ao menos que tenha sido alterado por ele mesmo. Em se tratando de conversão, se ler da saída padrão de um fluxo aberto por 'popen' lê-se da saída padrão de comando, e a entrada é a mesma da que foi chamada pelo popen.

Note que a saída dos fluxos popen são completamente 'bufferizadas'.

A função pclose espera pelo processo associado para terminar e retornar ao status de saída do comando, assim como retornado por wait4.

VALOR RETORNADO
A função popen devolve NULO se a chamada de fork(2) ou pipe(2) falhar ou se não conseguir alocar memória.

A função pclose devolve -1 se wait4 devolver um erro ou algum outro erro detectado.

ERROS
A função popen não seleciona o errno se a alocação de memória falhar. Se as rotinas fork() ou pipe() falharem, errno é selecionado adequadamente. Se o argumento mode for inválido e essa condição for detectada, errno é selecionado para EINVAL.

Se pclose() não puder obter o status de filho, errno será selecionado para ECHILD.

DE ACORDO COM
POSIX.2.

PROBLEMAS
Desde que o erro padrão de um comando aberto para leitura compartilha o deslocamento da busca com o processo chamado popen(), se o processo original tiver completado a leitura do 'buffer', a posição de entrada do comando pode não ser como esperado. Da mesma maneira, a saída de um comando aberto para escrita pode se tornar misturado com o processo original. A segunda pode ser evitada chamando fflush(3) antes de popen.

A falha de execução no interpretador de comandos não é distinguível da falha de execução interpretador ao executar um comando, ou uma saída imediata do comando. A única dica é o status da saída 127.

HISTÓRICO
As funções popen() e pclose() surgiram no Version 7 AT&T UNIX .

VEJA TAMBÉM
fork(2), sh(1), pipe(2), wait4(2), fflush(3), fclose(3), fopen(3), stdio(3), system(3).

TRADUZIDO POR LDP-BR EM 09/07/2001.

  Tradução:
Fernando Boaglio <boaglio@netscape.net>

  Revisão.:
André Luiz Fassone <lonely_wolf@ig.com.br>