popen, pclose - flujo desde o hacia un proceso
Biblioteca Estándar C (
libc,
-lc)
#include <stdio.h>
FILE *popen(const char *orden, const char *tipo);
int pclose(FILE *flujo);
popen(),
pclose():
_POSIX_C_SOURCE >= 2
|| /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
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.
The
type argument is a pointer to a null-terminated string which must
contain either the letter 'r' for reading or the letter 'w' for writing. Since
glibc 2.9, this argument can additionally include the letter 'e', which causes
the close-on-exec flag (
FD_CLOEXEC) to be set on the underlying file
descriptor; see the description of the
O_CLOEXEC flag in
open(2)
for reasons why this may be useful.
The return value from
popen() is a normal standard I/O stream in all
respects save that it must be closed with
pclose() rather than
fclose(3). Writing to such a stream writes to the standard input of the
command; the command's standard output is the same as that of the process that
called
popen(), unless this is altered by the command itself.
Conversely, reading from the stream reads the command's standard output, and
the command's standard input is the same as that of the process that called
popen().
Note that output
popen() streams are block buffered by default.
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).
popen(): on success, returns a pointer to an open stream that can be used
to read or write to the pipe; if the
fork(2) or
pipe(2) calls
fail, or if the function cannot allocate memory, NULL is returned.
pclose(): on success, returns the exit status of the command; if
wait4(2) returns an error, or some other error is detected, -1 is
returned.
On failure, both functions set
errno to indicate the error.
The
popen() function does not set
errno if memory allocation
fails. If the underlying
fork(2) or
pipe(2) fails,
errno
is set to indicate the error. If the
type argument is invalid, and this
condition is detected,
errno is set to
EINVAL.
Si
pclose() no puede obtener el estado del hijo, se asigna a
errno
el valor
ECHILD.
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 |
POSIX.1-2001, POSIX.1-2008.
The 'e' value for
type is a Linux extension.
Note: carefully read Caveats in
system(3).
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.
sh(1),
fork(2),
pipe(2),
wait4(2),
fclose(3),
fflush(3),
fopen(3),
stdio(3),
system(3)
La traducción al español de esta página del manual fue
creada por Gerardo Aburruzaga García <
[email protected]>,
Juan Piernas <
[email protected]> y Marcos Fouces
<
[email protected]>
Esta traducción es documentación libre; lea la
GNU
General Public License Version 3 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
[email protected]