Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.55 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <fcntl.h>
  6. #include <limits.h>
  7. #include <signal.h>
  8.  
  9. volatile __sig_atomic_t flag = 0;
  10.  
  11. void handler(int s)
  12. {
  13.     flag = 1;
  14. }
  15.  
  16. int main(int argc, char *argv[])
  17. {
  18.     setbuf(stdin, NULL);
  19.     sigaction(SIGUSR1, &(struct sigaction) {.sa_handler=handler, .sa_flags=SA_RESTART}, NULL);
  20.  
  21.     pid_t proc1 = getpid();
  22.     long long int mul;
  23.     long long int tmp;
  24.  
  25.     sscanf(argv[1], "%lld", &mul);
  26.  
  27.     int fd[2];
  28.     pipe(fd);
  29.  
  30.     pid_t proc2;
  31.     if ((proc2 = fork()) == 0) {
  32.         proc2 = getpid();
  33.         pid_t proc3;
  34.         if ((proc3 = fork()) == 0) {
  35.             while (1) {
  36.                 while (flag == 0) {
  37.                     pause();
  38.                 }
  39.                 flag = 0;
  40.                 read(fd[0], &tmp, sizeof(tmp));
  41.                 tmp *= mul;
  42.                 write(fd[1], &tmp, sizeof(tmp));
  43.                 kill(proc1, SIGUSR1);
  44.             }
  45.         }
  46.         flag = 1;
  47.         while (scanf("%lld", &tmp) != EOF) {
  48.             while (flag == 0) {
  49.                 pause();
  50.             }
  51.             flag = 0;
  52.             write(fd[1], &tmp, sizeof(tmp));
  53.             kill(proc3, SIGUSR1);
  54.         }
  55.         kill(proc1, SIGINT);
  56.         kill(proc3, SIGINT);
  57.         exit(0);
  58.     }
  59.     while (1) {
  60.         while (flag == 0) {
  61.             pause();
  62.         }
  63.         read(fd[0], &tmp, sizeof(tmp));
  64.         printf("%lld\n", tmp);
  65.         fflush(stdout);
  66.         flag = 0;
  67.         kill(proc2, SIGUSR1);
  68.     }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement