Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Procesos C - Linux

Estas en el tema de Procesos C - Linux en el foro de C/C++ en Foros del Web. Un proceso padre tiene que generar dos procesos hijos. El padre tiene que leer los datos de stdin ( por teclado) y tiene que enviarlos ...
  #1 (permalink)  
Antiguo 27/11/2010, 04:36
Avatar de oscarsb1988  
Fecha de Ingreso: abril-2010
Mensajes: 40
Antigüedad: 14 años
Puntos: 0
Mensaje Procesos C - Linux

Un proceso padre tiene que generar dos procesos hijos.

El padre tiene que leer los datos de stdin ( por teclado) y tiene que enviarlos a los hijos.

El hijo 1: -Sacará por pantalla el texto leído del padre, a la salida estándar.
El hijo 2: -Sacará lo leído a un fichero.

Cuando el padre reciba “exit” como entrada, enviará señales de terminación a los hijos y se cerrará.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6.  
  7. void proceso_1()
  8. {
  9.                printf ("Somos el primogénito\n");
  10.                printf (pal);
  11.                sleep(1);
  12.                exit(0);
  13. }
  14.  
  15. void proceso_2()
  16. {
  17.                printf ("Somos el segundo...\n");
  18.                sleep(5);
  19.                exit(0);
  20. }
  21.  
  22. int main()
  23. {
  24.  
  25.     pid_t hijo1;
  26.     pid_t hijo2;
  27.     int faltan;
  28.     int status;
  29.     pid_t cambiado;
  30.     char pal;
  31.  
  32.     hijo1 = fork();
  33.  
  34.     if (hijo1 == 0)
  35.     {
  36.         proceso_1();
  37.     }
  38.        elseif (hijo1 > 0)
  39.        {        
  40.         printf ("Proceso padre, a por otro hijo\n");
  41.         printf( "Introduzca una palabra: " );
  42.         scanf( "%c", &pal );
  43.        }
  44.  
  45.        hijo2 = fork();
  46.  
  47.     if (hijo2==0)
  48.         {
  49.         proceso_2();
  50.         }  
  51.         else
  52.         {
  53.         faltan = 2;
  54.  
  55.     do
  56.         {
  57.         cambiado = wait(&status);
  58.        
  59.                 if (WIFEXITED(status))
  60.                 {
  61.                 faltan--;
  62.                
  63.                                 if(cambiado == hijo1)
  64.                                 {
  65.                     printf("Termina el hijo1\n");
  66.                     else if (cambiado == hijo2)
  67.                     printf("Termina el hijo2\n");
  68.                     }
  69.                 }
  70.        } while (faltan > 0);
  71.     }
  72. }

Esta es la idea inicial... Obviamente se acerca a como debería de ser el código final pero todavía hay que editar bastante...

Un saludo y espero vuestras ideas para llevar todo esto a buen puerto :P

Edit1: Me comentan que es mejor hacerlo utilizando pipe() en vez de fork()

Última edición por oscarsb1988; 27/11/2010 a las 05:27
  #2 (permalink)  
Antiguo 27/11/2010, 05:46
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Procesos C - Linux

Deberias usar tanto fork como pipe. Al crear una nuevo hijo estos dos quedan incomunicados al menos que crees una tuberia (pipe).

Un pipe es el equivalente a hacer esto en linux:
echo "chau" | grep chau

La barra parada | es la que comunica los dos procesos.

Aca te paso una pagina que explica el funcionamiento:
http://tldp.org/LDP/lpg/node11.html
  #3 (permalink)  
Antiguo 28/11/2010, 13:23
Avatar de oscarsb1988  
Fecha de Ingreso: abril-2010
Mensajes: 40
Antigüedad: 14 años
Puntos: 0
Respuesta: Procesos C - Linux

Ok. Gracias por la ayuda ^^

Ya he empezado a hacerlo con pipe(), a ver si poco a poco va saliendo el código bien...

Código C:
Ver original
  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <signal.h>
  7.  
  8. pid_t pidHijo1();
  9. pid_t pidHijo2();
  10. int tuberia[2];
  11.  
  12. void procesoHijo1()
  13. {
  14.     char buffer[255];
  15.  
  16.     close(tuberia[0]);
  17.     close(0);
  18.     dup (tuberia[0]);
  19.  
  20.     for (;;)
  21.     {
  22.         fgets(buffer,254,stdin);
  23.         while (getc(stdin) != '\n');
  24.         printf("[H] %s", buffer);
  25.     }
  26. }
  27.  
  28. void procesoHijo2()
  29. {
  30.     char buffer[255];
  31.  
  32.     close(tuberia[1]);
  33.     close(0);
  34.     dup (tuberia[0]);
  35.  
  36.     for (;;)
  37.     {
  38.         fgets(buffer,254,stdin);
  39.         while (getc(stdin) != '\n');
  40.         printf("[H] %s", buffer);
  41.     }
  42. }
  43. void procesoPadre()
  44. {
  45.     char buffer[255];
  46.  
  47.     close(tuberia[1]);
  48.     close(0);
  49.     dup (tuberia[0]);
  50.  
  51.     for (;;)
  52.     {
  53.         fgets(buffer,254,stdin);
  54.         while (getc(stdin) != '\n');
  55.         printf("[H] %s", buffer);
  56.     }
  57.  
  58.     kill(pidHijo1, SIGTERM);
  59.     kill(pidHijo2, SIGTERM);
  60.     exit(0);
  61. }
  62.  
  63. int main()
  64. {
  65.     pipe(tuberia);
  66.  
  67.     pidHijo1 = fork();
  68.     pidHijo2 = fork();
  69.  
  70.     if (pidHijo1 < 0)
  71.     {
  72.         fprint(stderr, "Error en fork()\n");
  73.         exit(-1);
  74.     }
  75.  
  76.     if (pidHijo1 == 0)
  77.     {
  78.         procesoHijo1();
  79.     }
  80.     else
  81.     {
  82.         procesoPadre();
  83.     }
  84. }

Esta es otra aproximación... XD

Etiquetas: linux, procesos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:21.