popen(3)

NOMBRE
popen, pclose - flujo desde o hacia un proceso

BIBLIOTECA
Biblioteca Estándar C (libc, -lc)

SINOPSIS
#include <stdio.h>

FILE *popen(const char *orden, const char *tipo);
int pclose(FILE *flujo);

    Requisitos de Macros de Prueba de Características para glibc (véase feature_test_macros(7)):

popen(), pclose():
    _POSIX_C_SOURCE >= 2
        || /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

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 contener la letra 'r' para lectura o la letra 'w' para escritura. Desde glibc 2.9, este argumento puede incluir adicionalmente la letra 'e', lo que activa el indicador de cierre al ejecutar (FD_CLOEXEC) en el descriptor de archivo subyacente; consulte la descripción del indicador O_CLOEXEC en open(2) para conocer las razones por las que esto puede ser útil.

El valor de retorno de popen() es un flujo de E/S estándar normal en todos los aspectos, salvo que debe cerrarse con pclose() en lugar de fclose(3). Escribir en este flujo escribe 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 la modifique. Por el contrario, leer desde el flujo lee 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().

Tenga en cuenta que los flujos de salida popen() se almacenan en búfer de bloque por defecto.

La función pclose() espera que el proceso asociado termine, y devuelve el estado de salida de la orden como el devuelto por wait4(2).

VALOR DEVUELTO
popen(): en caso de éxito, devuelve un puntero a un flujo abierto que puede usarse para leer o escribir en la tubería; si las llamadas a fork(2) o pipe(2) fallan, o si la función no puede asignar memoria, se devuelve NULL.

pclose(): en caso de éxito, devuelve el estado de salida de la orden. Si wait4(2) devuelve un error o se detecta algún otro error, se devuelve -1.

Si ocurriese un fallo, ambas funciones establecen errno para indicar el error.

ERRORES
La función popen() no establece errno si falla la asignación de memoria. Si la función subyacente fork(2) o pipe(2) falla, se establece errno para indicar el error. Si el argumento tipo no es válido y se detecta esta condición, errno se establece en EINVAL.

Si pclose() no puede obtener el estado del hijo, se asigna a errno el valor ECHILD.

ATRIBUTOS
Para obtener una explicación de los términos usados en esta sección, véase attributes(7).
Interfaz | Atributo | Valor
popen(), pclose() | Seguridad del hilo | Multi-hilo seguro

VERSIONES
El valor 'e' para tipo es una extensión de Linux.

ESTÁNDARES
POSIX.1-2008.

HISTORIAL
POSIX.1-2001.

ADVERTENCIAS
Lea atentamente las advertencias en system(3).

ERRORES
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 en la ejecución de la shell es indistinguible de un fallo en la ejecución de la orden por parte de esa shell, o de una salida inmediata de la orden. La única pista es un estado de salida de 127.

VÉASE TAMBIÉN
sh(1), fork(2), pipe(2), wait4(2), fclose(3), fflush(3), fopen(3), stdio(3), system(3)

TRADUCCIÓN
La traducción al español de esta página del manual fue creada por Gerardo Aburruzaga García <gerardo.aburruzaga@uca.es>, Juan Piernas <piernas@ditec.um.es> y Marcos Fouces <marcos@debian.org>

Esta traducción es documentación libre; lea la GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.

Si encuentra algún error en la traducción de esta página del manual, envíe un correo electrónico a debian-l10n-spanish@lists.debian.org.