Advertisement
wowonline

Untitled

Dec 12th, 2021
558
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <signal.h>
  2. #include <unistd.h>
  3. #include <sys/wait.h>
  4. #include <fcntl.h>
  5. #include <stdio.h>
  6.  
  7. enum { BITS = 8 };
  8.  
  9. pid_t pid1, pid2;
  10. volatile sig_atomic_t flag = 0;
  11. volatile sig_atomic_t bit = -1;
  12.  
  13. void
  14. handler1(int s)
  15. {
  16.     bit = 0;
  17. }
  18.  
  19. void
  20. handler2(int s)
  21. {
  22.     bit = 1;
  23. }
  24.  
  25. void
  26. handler3(int s)
  27. {
  28.     flag = 1;
  29. }
  30.  
  31. void
  32. handler4(int s)
  33. {
  34.     _exit(0);
  35. }
  36.  
  37. int
  38. main(int argc, char *argv[])
  39. {
  40.     sigset_t s1;
  41.     sigemptyset(&s1);
  42.     sigaddset(&s1, SIGUSR1);
  43.     sigaddset(&s1, SIGUSR2);
  44.     sigaddset(&s1, SIGALRM);
  45.     sigaddset(&s1, SIGIO);
  46.     sigprocmask(SIG_BLOCK, &s1, NULL);
  47.     unsigned char byte;
  48.     int fds[2];
  49.     pipe(fds);
  50.     pid1 = fork();
  51.     if (pid1 == -1) {
  52.         return 1;
  53.     } else if (!pid1) {    // son 1 process
  54.         close(fds[1]);
  55.         sigset_t s2;
  56.         sigemptyset(&s2);
  57.         sigaction(SIGUSR1, &(struct sigaction){ .sa_handler = handler1, .sa_flags = SA_RESTART }, NULL);
  58.         sigaction(SIGUSR2, &(struct sigaction){ .sa_handler = handler2, .sa_flags = SA_RESTART }, NULL);
  59.         sigaction(SIGIO, &(struct sigaction){ .sa_handler = handler4, .sa_flags = SA_RESTART }, NULL);
  60.         read(fds[0], &pid2, sizeof(pid2));
  61.         close(fds[0]);
  62.         int bitcnt = 1;
  63.         int output = 0;
  64.  
  65.         while (1) {
  66.             while (bit == -1) {
  67.                 sigsuspend(&s2);
  68.             }
  69.             output += bit;
  70.             if (bitcnt == 8) {
  71.                 putchar(output);
  72.                 fflush(stdout);
  73.                 bitcnt = 0;
  74.                 output = 0;
  75.             }
  76.             output <<= 1;
  77.             bit = -1;
  78.             bitcnt++;
  79.             kill(pid2, SIGALRM);
  80.         }
  81.         _exit(0);
  82.     }
  83.    
  84.  
  85.     pid2 = fork();
  86.     if (pid2 == -1) {
  87.         return 1;
  88.     } else if (!pid2) {     // son 2 process
  89.         sigset_t s2;
  90.         sigemptyset(&s2);
  91.         sigaction(SIGALRM, &(struct sigaction){ .sa_handler = handler3, .sa_flags = SA_RESTART }, NULL);
  92.         close(fds[0]);
  93.         pid2 = getpid();
  94.         write(fds[1], &pid2, sizeof(pid2));
  95.         close(fds[1]);
  96.         int fd = open(argv[1], O_RDONLY);
  97.         while (read(fd, &byte, sizeof(byte)) == sizeof(byte)) {
  98.             for (int i = 0; i < BITS; ++i) {
  99.                 if (byte & 0x80) {
  100.                     kill(pid1, SIGUSR2);
  101.                 } else {
  102.                     kill(pid1, SIGUSR1);
  103.                 }
  104.                 while (!flag) {
  105.                     sigsuspend(&s2);
  106.                 }
  107.                 flag = 0;
  108.                 byte <<= 1;
  109.             }
  110.         }
  111.         close(fd);
  112.         kill(pid1, SIGIO);
  113.         _exit(0);
  114.     }
  115.  
  116.     close(fds[0]);
  117.     close(fds[1]);
  118.     waitpid(pid1, NULL, 0);
  119.     waitpid(pid2, NULL, 0);
  120.  
  121.     return 0;
  122. }
Advertisement
RAW Paste Data Copied
Advertisement