elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Procesos con fork
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Procesos con fork  (Leído 3,053 veces)
prof neurus

Desconectado Desconectado

Mensajes: 8



Ver Perfil
Procesos con fork
« 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.  


En línea

<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

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Procesos con fork
« Respuesta #1 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).


En línea

prof neurus

Desconectado Desconectado

Mensajes: 8



Ver Perfil
Re: Procesos con fork
« Respuesta #2 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.
En línea

<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./>
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listar procesos y realizar cosas con los procesos
Programación Visual Basic
sebas369 2 3,399 Último mensaje 14 Julio 2006, 16:08 pm
por sebas369
Fork en php
PHP
WHK 0 3,684 Último mensaje 8 Diciembre 2007, 09:26 am
por WHK
Emular MultiHilos (multithread) Sin Fork (FAKE FORK) « 1 2 »
PHP
OzX 14 9,511 Último mensaje 27 Marzo 2009, 00:24 am
por OzX
[Solucionado]Crear dos procesos duplicados a partir del padre usando fork() ?
Programación C/C++
16BITBoy 0 6,615 Último mensaje 17 Junio 2010, 22:31 pm
por 16BITBoy
fork
Programación C/C++
Pirat3net 1 2,214 Último mensaje 19 Diciembre 2016, 19:48 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines