Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.74 KB | None | 0 0
  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. En la siguiente práctica se nos pide desarrollar un programa en lenguaje C que realice lo siguiente:
  9.  
  10. El proceso padre generará dos procesos hijos. El padre, leerá datos de stdin (teclado) y los enviará
  11. a los hijos. El hijo#1 sacará por pantalla el texto leído del padre, a la salida estándar. El hijo #2 sacará
  12. lo leído a un fichero. Cuando el padre tenga como entrada “exit”, mandará señales de terminación a
  13. los hijos y se cerrará.
  14. */
  15. pid_t pidAmigoChivato,pidAmigoResponsable;
  16.  
  17. FILE *out;
  18.  
  19. int tuberia[2];
  20. int tuberia2[2];
  21.  
  22. /*Proceso del Amigo Chivato*/
  23. void procesoAmigoChivato(){
  24.     char buffer[255];
  25.    
  26.     close(tuberia[1]);
  27.     close(0);
  28.     dup(tuberia[0]);
  29.  
  30.         /* Escucha el secreto que le cuenta su amigo */
  31.         fgets(buffer, 254, stdin);
  32.  
  33.                 /* Como es un chivato lo cuenta mostrándolo por pantalla */
  34.         printf("\n[AmigoChivato - %d]:> El secreto es: %s", getpid(),buffer);
  35.     exit(0);
  36. }
  37. /*Proceso del Amigo Responsable*/
  38. void procesoAmigoResponsable(){
  39.     char buffer[255];
  40.    
  41.     close(tuberia2[1]);
  42.     close(0);
  43.     dup(tuberia2[0]);
  44.  
  45.         /* Escucha el secreto que le cuenta su amigo */
  46.         fgets(buffer, 254, stdin);
  47.  
  48.                 /* Llama chivato al amigo */
  49.                 printf("[%d] ¡Eres un chivato!..", pidAmigoChivato);
  50.  
  51.                 /* Como es un amigo responsable, en lugar de comunicarselo a todos se lo guarda para él*/     
  52.                 out = fopen( "/home/monje/CajaSecretos.txt", "w" );      
  53.         if( out != NULL ) fprintf( out, "Secreto: %s", buffer );
  54.         fclose(out);
  55.  
  56.     exit(0);
  57.    
  58. }
  59.  
  60. void procesoAmigo(){
  61.     char buffer[255];
  62.  
  63.     close(tuberia[0]);
  64.     close(tuberia2[0]);
  65.     close(2);
  66.     dup2(tuberia[1],2);
  67.     dup2(tuberia2[1],2);
  68.  
  69.     fgets(buffer, 254, stdin);
  70.  
  71.     while(strlen(buffer) != 0 && buffer[0] != '\n'){
  72.             fprintf(stderr, "%s\n", buffer);            
  73.             fgets(buffer, 254, stdin);
  74.     }
  75.  
  76.     exit(0);
  77. }
  78.  
  79. int main(){
  80.  
  81.     pipe(tuberia);
  82.     pipe(tuberia2);
  83.     //Hijo1
  84.     switch (pidAmigoChivato = fork()){
  85.         case -1: // algo va mal
  86.             perror ("fork");
  87.             exit (0);
  88.         case 0: // soy el hijo1!
  89.                 procesoAmigoChivato();
  90.             exit (0);
  91.         default: // soy el padre!
  92.                 break;
  93.     }
  94.     //Hijo2
  95.     switch (pidAmigoResponsable = fork()){
  96.         case -1: // algo va mal
  97.             perror ("fork");
  98.             exit (0);
  99.  
  100.         case 0: // soy el hijo2!
  101.                 procesoAmigoResponsable();
  102.                 exit (0);
  103.  
  104.         default: // soy el padre!
  105.                 break;
  106.     }
  107.  
  108.  
  109.     printf("[Amigo - %d] cuenta secreto a [AmigoChivato - %d] y [AmigoResponsable - %d] \n", getpid(), pidAmigoChivato, pidAmigoResponsable);
  110.     printf("¡Amigo cuenta tu secreto!:> ");
  111.     procesoAmigo();
  112.    
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement