NOMBRE¶
popen, pclose - E/S de procesos
SINOPSIS¶
#include <stdio.h>
FILE *popen(const char *orden, const char
*tipo);
int pclose(FILE *flujo);
DESCRIPCIÓN¶
La función
popen() inicia un proceso creando una tubería,
llamando a
fork(2) para crear el proceso y ejecutando el
intérprete de órdenes (shell). Puesto que una tubería es
unidireccional por definición, el argumento
tipo sólo puede
especificar lectura o escritura, pero no ambos; el flujo resultante es
respctivamente de lectura o escritura exclusiva.
El argumento
orden es un puntero a una cadena terminada en cero que
contiene una línea de orden del shell. Esta orden se pasa a
/bin/sh precedida de la opción
-c; si se necesita
interpretar la línea, esto lo hace el shell. El argumento
tipo es
un puntero a una cadena terminada en cero que debe ser o "r" para
lectura o "w" para escritura.
El valor devuelto por
popen() es un flujo normal de E/S estándar a
todos los efectos salvo en que debe cerrarse con
pclose() en vez de con
fclose(). Escribir a dicho flujo significa escribir en la entrada
estándar de la orden; la salida estándar de la orden es la misma que
la del proceso que llamó a
popen(), a menos que la propia orden
modifique esto. De modo análogo, leer de un flujo de `popen' implica leer
de la salida estándar de la orden, y la entrada estándar de la orden
es la misma que la del proceso que llamó a
popen.
Observe que los flujos de salida de
popen son completamente tamponados
(buffered) de forma predeterminada.
La función
pclose espera que el proceso asociado termine, y devuelve
el estado de salida de la orden como el devuelto por
wait4.
VALOR DEVUELTO¶
La función
popen devuelve
NULL si las llamadas a
fork(2) o a
pipe(2) fallan, o si no puede reservar memoria.
La función
pclose devuelve -1 si
wait4 devuelve un error o se
detecta algún otro error.
ERRORES¶
La función
popen no asigna un valor a
errno si falla la
reserva de memoria. Si las funciones subyacentes
fork() o
pipe()
fallan, a
errno se le asigna un valor apropiado. Si el argumento
mode es incorrecto y se detecta esta condición, a
errno se
le asigna el valor
EINVAL.
Si
pclose() no puede obtener el estado del hijo, se asigna a
errno
el valor
ECHILD.
POSIX.2
FALLOS¶
Puesto que la entrada estándar de una orden abierta para lectura comparte
su puntero de posición con el proceso que llamó a
popen(), si
el proceso original ha hecho una lectura tamponada, la posición en la
entrada de la orden puede no ser la esperada. De forma similar, la salida de
una orden abierta para escritura puede resultar mezclada con la del proceso
original. Esto último puede evitarse llamando a
fflush(3) antes de
a
popen.
Un fallo al ejecutar el shell es indistinguible de un fallo del shell al
ejecutar la orden, o una salida inmediata de la orden. La única pista es
un estado de salida 127.
HISTORIA¶
Una función
popen() y otra
pclose() apareció en UNIX de
AT&T Versión 7.
VÉASE TAMBIÉN¶
fork(2),
sh(1),
pipe(2),
wait4(2),
fflush(3),
fclose(3),
fopen(3),
stdio(3),
system(3)