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.
CONFORME A
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)