Guest User

Untitled

a guest
Jan 21st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.41 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5.  
  6. // Manejador de alarma
  7. void alarma() {}
  8.  
  9. void manejador1() {
  10.     execlp ("ls","ls",NULL);
  11. }
  12.  
  13. void manejador2() {
  14.     execlp ("pstree","pstree","-p",NULL);
  15. }
  16.  
  17. int main (int argc, char* argv[]) {
  18.    
  19.     // Los pid de cada uno
  20.     pid_t pidEjec, pidA, pidB, pidX, pidY, pidZ, objetivo;
  21.        
  22.     int seg; // Para los segundos que se pasa por argumento
  23.     seg=atoi(argv[2]); // Los convertimos a int
  24.    
  25.     char proceso=*argv[1]; // Guardamos el primer argumento en una variable char
  26.    
  27.     /* Aqui guarda el pid del ejec */
  28.     pidEjec = getpid();
  29.    
  30.     switch(fork()) {
  31.    
  32.     case -1 : /* ERROR */
  33.             perror("Error en fork ejec\n");
  34.             exit(1);
  35.            
  36.     case 0 : /* Hijo de arb (A) */
  37.             pidA = getpid(); // Guardamos el pid de A
  38.    
  39.             switch(fork()) { /* A crea B */
  40.    
  41.                 case -1 : /* ERROR */
  42.                         perror("Error en fork A\n");
  43.                         exit(1);
  44.                        
  45.                 case 0 : /* Hijo de A (B) */
  46.                    
  47.                     switch(fork()) { /* B crea X */
  48.                        
  49.                         case -1 : /* ERROR */
  50.                                 perror("Error en fork B\n");
  51.                                 exit(1);
  52.                        
  53.                         case 0 : /* X */
  54.                        
  55.                                 // Guardamos el pid de X
  56.                                 pidX = getpid();
  57.                                
  58.                                 printf("Soy el proceso X: mi pid es %d. Mi padre es %d. Mi abuelo es %d. Mi bisabuelo es %d\n", getpid(), getppid(), pidA, pidEjec);
  59.                                 signal(SIGALRM,alarma);
  60.                                
  61.                                 signal(SIGUSR1, manejador1);
  62.                                
  63.                                 alarm(seg);
  64.                                 pause();
  65.                                
  66.                                
  67.                                
  68.                                 printf("Soy X(%d) y muero\n", getpid());
  69.                                 exit(0);
  70.                         default :
  71.                                 switch(fork()) { /* B crea Y */
  72.                        
  73.                                     case -1 : /* ERROR */
  74.                                             perror("Error en fork B\n");
  75.                                             exit(1);
  76.                        
  77.                                     case 0 : /* Y */
  78.                                    
  79.                                             // Guardamos el pid de Y
  80.                                             pidY = getpid();
  81.                                            
  82.                                             printf("Soy el proceso Y: mi pid es %d. Mi padre es %d. Mi abuelo es %d. Mi bisabuelo es %d\n", getpid(), getppid(), pidA, pidEjec);
  83.                                             signal(SIGALRM,alarma);
  84.                                            
  85.                                             signal(SIGUSR1, manejador1);
  86.                                            
  87.                                             alarm(seg);
  88.                                             pause();
  89.                                            
  90.                                            
  91.                                            
  92.                                             printf("Soy Y(%d) y muero\n", getpid());
  93.                                             exit(0);
  94.                                     default :
  95.                                             switch(fork()) { /* B crea Z */
  96.                        
  97.                                                 case -1 : /* ERROR */
  98.                                                         perror("Error en fork B\n");
  99.                                                         exit(1);
  100.                        
  101.                                                 case 0 : /* Z */
  102.                                                
  103.                                                         //El pid de Z no es necesario guardarlo
  104.                                                        
  105.                                                         printf("Soy el proceso Z: mi pid es %d. Mi padre es %d. Mi abuelo es %d. Mi bisabuelo es %d\n", getpid(), getppid(), pidA, pidEjec);
  106.                                                         signal(SIGALRM,alarma);
  107.                                                         alarm(seg);
  108.                                                         pause();
  109.                                
  110.                                                         // Determinamos el objetivo que va a ejecutar
  111.                                                         switch(proceso) {
  112.                                                             case 'A' : objetivo=pidA; break;
  113.                                                             case 'B' : objetivo=pidB; break;
  114.                                                             case 'X' : objetivo=pidX; break;
  115.                                                             case 'Y' : objetivo=pidY; break;
  116.                                                             default : printf("Parametro 1 incorrecto, no se hace nada.\n");
  117.                                                         }
  118.                                                        
  119.                                                         // Envio la señal quien toque
  120.                                                         kill(objetivo, SIGUSR1);
  121.  
  122.                                                         printf("Soy Z(%d) y muero\n", getpid());
  123.                                                         exit(0);
  124.                                
  125.                                                 default : /* B */
  126.                                                
  127.                                                     // Guardamos el pid de B
  128.                                                     pidB = getpid();
  129.                                                    
  130.                                                     // B: su padre (A) esta guardado en pidA, su pidA (arb) en pidEjec
  131.                                                     printf("Soy el proceso B: mi pid es %d. Mi padre es %d. Mi abuelo es %d\n", getpid(), getppid(), pidEjec);
  132.                                                    
  133.                                                     signal(SIGUSR1, manejador2);
  134.                                                    
  135.                                                     // B espera a que mueran sus 3 hijos
  136.                                                     wait();
  137.                                                     wait();
  138.                                                     wait();
  139.                                                     printf("Soy B(%d) y muero\n", getpid());
  140.                                                     exit(0);
  141.                                             }
  142.                                 }
  143.                     }
  144.  
  145.                 default : /* A */
  146.                         printf("Soy el proceso A: mi pid es %d. Mi padre es %d\n", getpid(), pidEjec);
  147.                        
  148.                         signal(SIGUSR1, manejador2);
  149.                        
  150.                         wait(); /*Espera a su hijo*/
  151.                         printf("Soy A(%d) y muero\n", getpid());
  152.                         exit(0);
  153.                 }
  154.            
  155.     default : /* Raiz del arbol (arb) */           
  156.             printf("Soy el proceso ejec: mi pid es %d\n", getpid());
  157.             wait(); /*Espera a su hijo*/
  158.             printf("Soy ejec(%d) y muero\n", getpid());
  159.             exit(0);
  160.     }
  161. }
Add Comment
Please, Sign In to add comment