Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.03 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <wait.h>
  5. #include <signal.h>
  6. #include <fcntl.h>
  7. #include <sys/stat.h>
  8. #include <sys/types.h>
  9. #include <sys/ipc.h>
  10. #include <sys/sem.h>
  11. #include <sys/shm.h>
  12. #include <limits.h>
  13.  
  14. long long mult;
  15. pid_t gen0, gen1, gen2;
  16. int fd[2];
  17.  
  18. void
  19. hndlr_end(int sig)
  20. {
  21.     signal(SIGUSR1, hndlr_end);
  22.  
  23.     printf("hndlr_end\n");
  24.  
  25.     if (!gen2 && !gen1) {
  26.         exit(0);
  27.     } else {
  28.         wait(NULL);
  29.         exit(0);
  30.     }
  31. }
  32.  
  33. void
  34. hndlr(int sig)
  35. {
  36.     signal(SIGUSR1, hndlr);
  37.  
  38.     printf("hndlr\n");
  39.     printf("gen0= %d, gen1 = %d, gen2 = %d\n", gen0, gen1, gen2);
  40.  
  41.     long long elm;
  42.  
  43.     if (!gen2 && !gen1) {   //grandson
  44.         read(fd[0], &elm, sizeof(elm));
  45.         printf("%lld\n", elm);
  46.         elm *= mult;
  47.         write(fd[1], &elm, sizeof(elm));
  48.         kill(gen0, SIGUSR1);
  49.     } else if (!gen1) {   //son
  50.         if (scanf("%lld", &elm) != 1) {
  51.             printf("END\n");
  52.             signal(SIGUSR1, hndlr_end);
  53.             kill(gen2, SIGUSR1/*!SIGTERM*/);
  54.             wait(NULL);
  55.             printf("*********\n");
  56.             kill(gen0, SIGUSR1);
  57.             exit(0);
  58.         }
  59.         write(fd[1], &elm, sizeof(elm));
  60.         kill(gen2, SIGUSR1);
  61.     } else {
  62.         read(fd[0], &elm, sizeof(elm));
  63.         printf("%lld\n", elm);
  64.         kill(gen1, SIGUSR1);
  65.     }
  66. }
  67.  
  68. int
  69. main(int argc, char **argv)
  70. {
  71.     signal(SIGUSR1, hndlr);
  72.  
  73.     setbuf(stdin, NULL);
  74.     setbuf(stdout, NULL);
  75.  
  76.     sscanf(argv[1], "%lld", &mult);
  77.  
  78.     pipe(fd);
  79.  
  80.     gen0 = getpid();
  81.     gen1 = fork();
  82.     if (gen1 < 0) {
  83.         _exit(0);
  84.     } else if (!gen1) {
  85.         gen2 = fork();
  86.         if (gen2 < 0) {
  87.             _exit(0);
  88.         } else if (!gen2) {
  89.             kill(getppid(), SIGUSR1);
  90.             while (1) {
  91.                 pause();
  92.             }
  93.         } else {
  94.             while (1) {
  95.                 pause();
  96.             }
  97.         }
  98.     } else {
  99.         while (1) {
  100.             pause();
  101.         }
  102.     }
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement