Advertisement
wowonline

Untitled

Dec 12th, 2021
662
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.70 KB | None | 0 0
  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.     char byte;
  48.     int fds[2];
  49.     pipe(fds);
  50.     pid1 = fork();
  51.     if (pid1 == -1) {
  52.         return 1;
  53.     } else if (!pid1) {
  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.  
  82.         _exit(0);
  83.     }
  84.    
  85.  
  86.     pid2 = fork();
  87.     if (pid2 == -1) {
  88.         return 1;
  89.     } else if (!pid2) {
  90.         sigset_t s2;
  91.         sigemptyset(&s2);
  92.         sigaction(SIGALRM, &(struct sigaction){ .sa_handler = handler3, .sa_flags = SA_RESTART }, NULL);
  93.         close(fds[0]);
  94.         pid1 = getpid();
  95.         write(fds[1], &pid1, sizeof(pid1));
  96.         close(fds[1]);
  97.         int fd = open(argv[1], O_RDONLY);
  98.         while (read(fd, &byte, sizeof(byte)) == sizeof(byte)) {
  99.             for (int i = 0; i < BITS; ++i) {
  100.                 if (byte & 0x1) {
  101.                     kill(pid1, SIGUSR1);
  102.                 } else {
  103.                     kill(pid1, SIGUSR2);
  104.                 }
  105.                 byte >>= 1;
  106.                 while (!flag) {
  107.                     sigsuspend(&s2);
  108.                 }
  109.                 flag = 0;
  110.             }
  111.         }
  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
Add Comment
Please, Sign In to add comment
Advertisement