¿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);
}
}
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:
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.