Tuberías en Linux
Publicado en C/C++, Linux el 25 de June, 2008 por Fran. (Sin comentarios)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 estandar
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];
//Cerramos la parte de escritura
close (data_pipe[1]);
//Leemos la salida
int ret = read (data_pipe[0], salida, 200);
while (ret > 0) {
printf ("%s", salida);
ret = read (data_pipe[0], salida, 200);
}
close (data_pipe[0]);
}
//Controlador
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;
}