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

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.
Código (c) [Seleccionar]
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);
}