procesos - tuberias con nombre en c
obtener salida de comando en pipe, C para Linux (4)
¿Es esto?
NAME popen, pclose - process I/O SYNOPSIS #include <stdio.h> FILE *popen(const char *command, const char *type); int pclose(FILE *stream); DESCRIPTION The popen() function opens a process by creating a pipe, forking, and invoking the shell. Since a pipe is by definition unidirectional, the type argument may specify only reading or writing, not both; the resulting stream is correspondingly read-only or write-only. The command argument is a pointer to a null-terminated string containing a shell command line. This command is passed to /bin/sh using the -c flag; interpretation, if any, is performed by the shell. The type argument is a pointer to a null-terminated string which must be either ‘r’ for reading or ‘w’ for writing. 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(). 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 a ‘‘popened’’ 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 fully buffered by default. The pclose() function waits for the associated process to terminate and returns the exit status of the command as returned by wait4().
Necesito ejecutar un comando de la CLI de Linux y obtener su salida estándar de C.
Puedo usar pipe () para crear un conducto, luego fork / exec, redirigir el descriptor stdout del niño al conducto antes de llamar a exec (), y leer el conducto en el padre. Además, tendré que esperar al niño.
¿Hay una simple llamada a hacer fork + redirigir + exec + wait, al igual que system () hace fork + exec + wait, only system () no hace la redirección.
Hay popen (), que hace fork + redirect + exec, pero no espera, por lo que no puedo obtener el estado de salida.
Esto es lo que uso:
/* simply invoke a app, pipe output*/
pipe = popen(buf, "r" );
if (pipe == NULL ) {
printf("invoking %s failed: %s/n", buf, strerror(errno));
return 1;
}
waitfor(10);
while(!feof(pipe) ) {
if( fgets( buf, 128, pipe ) != NULL ) {
printf("%s/n", buf );
}
}
/* Close pipe */
rc = pclose(pipe);
GLib tiene una buena función para esto: g_spawn_sync()
: http://library.gnome.org/devel/glib/stable/glib-Spawning-Processes.html#g-spawn-sync
Por ejemplo, para ejecutar un comando y obtener su estado de salida y salida:
const char *argv[] = { "your_command", NULL };
char *output = NULL; // will contain command output
GError *error = NULL;
int exit_status = 0;
if (!g_spawn_sync(NULL, argv, NULL, 0, NULL, NULL,
&output, NULL, &exit_status, &error))
{
// handle error here
}
Use popen()
y pclose()
.
popen()
realidad no espera, por supuesto, pero las lecturas en la tubería se bloquearán hasta que haya datos disponibles.
pclose()
espera, pero llamarlo prematuramente podría cortar algo de salida del proceso bifurcado. Querrá determinar a partir de la transmisión cuando el niño termine ...
Posiblemente ya se discutió en ¿Cómo puedo ejecutar un programa externo desde C y analizar su salida?