Procesos con fork

Iniciado por prof neurus, 23 Mayo 2020, 02:05 AM

0 Miembros y 1 Visitante están viendo este tema.

prof neurus

Hola a todos. Estoy viendo el tema de procesos con fork y tuberías con pipe y haciendo un mini shell (o intentando :D). Mi problema se presenta cuando, para decirlo más gráficamente, encuentro un comando o mandato como este:

Código (bash) [Seleccionar]
ls | grep 'patron' | wc -l

Entonces, en este caso son 3 comandos. Tengo un código de prueba pero no esta funacionando. Si alguien pasó por esto o tiene alguna sugerencia bienvenido sea.


int main (int argc, char *argv[]) {
int i,
fd[2], fd0[2],
pid[3];

/* Creación recurso tubería, por el padre */
pipe(fd);

/* 1er hijo, ejecuta ls */
if ( (pid[0]= fork()) == 0) {
dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
execlp("/bin/ls", "ls", NULL);
perror("Hijo1: Fallo al hacer exec");
exit (1);
}

pipe(fd0);

/* 2do hijo, ejecuta filtro */
if ( (pid[1]=fork()) == 0) {
dup2(fd[0], STDIN_FILENO);
close(fd[1]);
dup2(fd0[1], STDOUT_FILENO);
close(fd0[0]);
char* arg[] = { "sort", "sort", NULL };
execvp(arg[0], &arg[1]);
//execvp(argv[1], &argv[1]);
perror("Hijo2: Fallo al hacer exec");
exit(1);
}

if((pid[2]=fork()) == 0) {
dup2(fd0[0], STDIN_FILENO);
close(fd0[1]);
char* arg[] = { "wc", "wc", "-l", NULL };
execvp(arg[0], &arg[1]);
perror("Hijo2: Fallo al hacer exec");
exit(1);
}

/* El padre no interviene */
close(fd[0]);
close(fd[1]);
close(fd0[0]);
close(fd0[1]);
/*for (i=0; i<2; i++)
wait(pid[i]);*/
exit (0);
}
<Desde las primeras computadoras siempre hubo fantasmas en la máquina. Segmentos aleatorios de código que se agrupan para formar protocolos inesperados. Podría llamarse conducta. Radicales libres que engendran interrogantes de libre albedrío creatividad y hasta la naturaleza de lo que podría ser un alma./>

RayR

A simple vista el error que veo es en el último proceso hijo. Siempre debes cerrar los descriptores que no usas en cada proceso, y en ese último no lo estás haciendo con los de fd. Eso debe estar provocando un bloqueo.

Además, el wait final lo estás usando incorrectamente. Deberías pasarle NULL como parámetro (o usar waitpid, si quieres especificar pids concretos, pero no lo veo necesario).

prof neurus

RayR a partir de ahora eres mi nuevo amigo  ;-)

Cerré los descriptores en el último proceso hijo y funcionó tal como dijiste.

Muchas gracias.
<Desde las primeras computadoras siempre hubo fantasmas en la máquina. Segmentos aleatorios de código que se agrupan para formar protocolos inesperados. Podría llamarse conducta. Radicales libres que engendran interrogantes de libre albedrío creatividad y hasta la naturaleza de lo que podría ser un alma./>