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;
}

Sin comentarios

Escribe un comentario