Tuberías en Linux
Publicado en C/C++, Linux el 25 de June, 2008 por Fran.Hace unos días expliqué cómo redirigir la salida de un proceso que ejecutemos desde nuestro programa en Windows, hoy voy a explicar cómo hacerlo en Linux (algo que todos deberías de saber ya).
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
/* Proceso hijo */
void
do_child (int data_pipe[])
{
/* Cerramos la parte de la tubería que no usamos (lectura) */
close (data_pipe[0]);
/* Tubería de escritura a salida estándar */
dup2 (data_pipe[1], STDOUT_FILENO);
/* Ejecutamos el proceso que queramos (p. ej.: ls) */
execvp ("ls", NULL);
perror ("execvp");
}
/* Proceso padre */
void
do_parent (int data_pipe[])
{
char salida[200];
int nread;
/* Cerramos la parte de escritura */
close (data_pipe[1]);
/* Leemos la salida */
nread = read (data_pipe[0], salida, 200);
while (nread > 0) {
printf ("%s", salida);
nread = read (data_pipe[0], salida, 200);
}
close (data_pipe[0]);
}
int
main (int argc, char* argv[])
{
int data_pipe[2];
int pid;
int rc;
rc = pipe (data_pipe);
if (rc == -1) {
perror ("pipe");
exit (1);
}
pid = fork ();
switch (pid) {
case -1:
perror ("fork");
break;
/* Proceso hijo */
case 0:
do_child (data_pipe);
break;
/* Proceso padre */
default:
do_parent (data_pipe);
break;
}
return 0;
}