Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: prof neurus en 23 Mayo 2020, 02:05 am



Título: Procesos con fork
Publicado por: prof neurus en 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
  1. 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
  1. int main (int argc, char *argv[]) {
  2. int i,
  3. fd[2], fd0[2],
  4. pid[3];
  5.  
  6. /* Creación recurso tubería, por el padre */
  7. pipe(fd);
  8.  
  9. /* 1er hijo, ejecuta ls */
  10. if ( (pid[0]= fork()) == 0) {
  11. dup2(fd[1], STDOUT_FILENO);
  12. close(fd[0]);
  13. execlp("/bin/ls", "ls", NULL);
  14. perror("Hijo1: Fallo al hacer exec");
  15. exit (1);
  16. }
  17.  
  18. pipe(fd0);
  19.  
  20. /* 2do hijo, ejecuta filtro */
  21. if ( (pid[1]=fork()) == 0) {
  22. dup2(fd[0], STDIN_FILENO);
  23. close(fd[1]);
  24. dup2(fd0[1], STDOUT_FILENO);
  25. close(fd0[0]);
  26. char* arg[] = { "sort", "sort", NULL };
  27. execvp(arg[0], &arg[1]);
  28. //execvp(argv[1], &argv[1]);
  29. perror("Hijo2: Fallo al hacer exec");
  30. exit(1);
  31. }
  32.  
  33. if((pid[2]=fork()) == 0) {
  34. dup2(fd0[0], STDIN_FILENO);
  35. close(fd0[1]);
  36. char* arg[] = { "wc", "wc", "-l", NULL };
  37. execvp(arg[0], &arg[1]);
  38. perror("Hijo2: Fallo al hacer exec");
  39. exit(1);
  40. }
  41.  
  42. /* El padre no interviene */
  43. close(fd[0]);
  44. close(fd[1]);
  45. close(fd0[0]);
  46. close(fd0[1]);
  47. /*for (i=0; i<2; i++)
  48. wait(pid[i]);*/
  49. exit (0);
  50. }
  51.  


Título: Re: Procesos con fork
Publicado por: RayR en 23 Mayo 2020, 17:11 pm
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).


Título: Re: Procesos con fork
Publicado por: prof neurus en 27 Mayo 2020, 01:59 am
RayR a partir de ahora eres mi nuevo amigo  ;-)

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

Muchas gracias.