Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - prof neurus

#1
Programación C/C++ / Procesos con fork
23 Mayo 2020, 02:05 AM
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);
}