es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo uso 2 procesos secundarios, uno para ejecutar un comando y otro para leer la salida y pasarla al siguiente?

Entonces, mi programa necesita canalizar múltiples procesos y leer la cantidad de bytes que cada proceso produce como salida.

La forma en que lo implementé, en un bucle for, tenemos dos hijos:

Hijo 1: duplica la salida y ejecuta el proceso

Hijo 2: lee la salida y la escribe para la siguiente entrada

Actualmente, el hijo 1 ejecuta el proceso y el hijo 2 lee su salida, pero parece que no la escribe en el lugar correcto porque en la segunda iteración del bucle la imprime en la pantalla y bloquea.

for (int i = 0; i < procesos; i++) {

int resultado = socketpair(PF_LOCAL, SOCK_STREAM, 0, apipe[i]);

if (resultado == -1) {

  error_y_salir();

}

int pid;
int pid2;

pid = fork_o_morir();
// el hijo uno apunta a STDOUT

if (pid == FORK_CHILD) {

    if (dup2(apipe[i][1], STDOUT_FILENO) == -1)
        error_y_salir();

    if (close(apipe[i][1]) == -1)
        error_y_salir();

    if (close(apipe[i][0]) == -1)
        error_y_salir();  

    if (execlp("/bin/sh", "sh", "-c", tabCommande[i], (char *)NULL) == -1)
        error_y_salir();    
}

pid2 = fork_o_morir();

// EL HIJO 2 lee la salida y la escribe para que la siguiente comando la use

if(pid2 == FORK_CHILD){      
    FILE *fp;

    fp = fopen("count", "a");

    close(apipe[i][1]);
    int count=0;

    char str[4096];
    count = read(apipe[i][0], str, sizeof(str)+1);
    close(apipe[i][0]);

    write(STDIN_FILENO, str, count);

    fprintf(fp, "%d : %d \n ", i, count);  
    fclose(fp);

 }

}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está con el hijo 2 que no está escribiendo la salida en el lugar correcto. En la implementación actual, el hijo 2 lee la salida del pipe y la escribe en STDOUT_FILENO, que puede no ser el lugar deseado.

    Para leer el número de bytes que produce cada proceso, el hijo 2 debería escribir la salida en un archivo o un búfer que pueda ser analizado posteriormente. Un ejemplo de cómo modificar al hijo 2 para que escriba la salida en un archivo se muestra a continuación:

    pid2 = fork_or_die();
    
    // El HIJO 2 lee la salida y la escribe en un archivo
    if(pid2 == FORK_CHILD){      
        FILE *fp;
    
        fp = fopen("output.txt", "a"); // abrir el archivo en modo de añadir
    
        close(apipe[i][1]);
        int count=0;
    
        char str[4096];
        count = read(apipe[i][0], str, sizeof(str)+1);
        close(apipe[i][0]);
    
        fprintf(fp, "%d : %d\n", i, count); // escribir el número de proceso y el tamaño de la salida en el archivo
        fwrite(str, 1, count, fp); // escribir la salida en el archivo
    
        fclose(fp);
    
     }
    

    En esta implementación modificada, el hijo 2 abre el archivo “output.txt” en modo de añadir y escribe el número de proceso y el tamaño de la salida utilizando fprintf. Luego utiliza fwrite para escribir la salida en el archivo. De esta manera, podemos analizar la salida de cada proceso posteriormente leyendo el contenido del archivo.

Comments are closed.