Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.92 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<signal.h>
  3. #include<sys/types.h>
  4. #include<unistd.h>
  5. #include<sys/wait.h>
  6. #include<limits.h>
  7. #include<fcntl.h>
  8.  
  9. volatile int flag1 = 0, flag2 = 0;
  10. volatile char abc = 0;
  11. volatile int k = 0;
  12. volatile pid_t p1, p2, pp;
  13.  
  14. void dadhandler(int signo) {
  15.     if (signo == SIGIO) {
  16.         wait(NULL);
  17.         wait(NULL);
  18.         _exit(0);
  19.     } else {
  20.         kill(p2, SIGALRM);      
  21.     }
  22. }
  23.  
  24. void flg(int signo) {
  25.     flag1 = 1;
  26. }
  27.  
  28. void handler(int signo)
  29. {
  30.     //printf("sig : %d %d\n", k, abc);
  31.     if(signo == SIGUSR1) {
  32.         if(k == CHAR_BIT - 1) {
  33.             abc <<= 1;
  34.             printf("%c", abc);
  35.             abc = 0;
  36.             k = 0;
  37.         } else {
  38.             k++;
  39.             abc <<= 1;
  40.         }
  41.     } else if(signo == SIGUSR2) {
  42.         if(k == CHAR_BIT - 1) {
  43.             abc = (abc << 1) + 1;
  44.             printf("%c", abc);
  45.             abc = 0;
  46.             k = 0;
  47.         } else {
  48.             k++;
  49.             abc = (abc << 1) + 1;
  50.         }
  51.     } else if(signo == SIGIO) {
  52.         kill(pp, SIGIO);
  53.         printf("\n");
  54.         _exit(0);
  55.     }
  56.     flag2 = 1;
  57.     fflush(stdout);
  58. }
  59.  
  60. int main(int argc, char *argv[])
  61. {
  62.     pp = getpid();
  63.    
  64.     struct sigaction ppsa;
  65.     sigemptyset(&ppsa.sa_mask);
  66.     ppsa.sa_handler = dadhandler;
  67.     ppsa.sa_flags = SA_RESTART;
  68.     sigaction(SIGALRM, &ppsa, NULL);
  69.     sigaction(SIGIO, &ppsa, NULL);
  70.    
  71.     sigset_t pps;
  72.     sigaddset(&pps, SIGUSR1);
  73.     sigaddset(&pps, SIGUSR2);
  74.     sigaddset(&pps, SIGIO);
  75.     sigaddset(&pps, SIGALRM);
  76.     sigprocmask(SIG_BLOCK, &pps, NULL);
  77.    
  78.     p1 = fork();
  79.     if(!p1) {
  80.        
  81.         struct sigaction sa;
  82.         sigemptyset(&sa.sa_mask);
  83.         sa.sa_flags = SA_RESTART;
  84.         sa.sa_handler = handler;
  85.         sigaction(SIGUSR1, &sa, NULL);
  86.         sigaction(SIGUSR2, &sa, NULL);
  87.         sigaction(SIGIO, &sa, NULL);
  88.      
  89.         sigprocmask(SIG_UNBLOCK, &pps, NULL);
  90.         while(1) {
  91.             while(!flag2);
  92.             flag2 = 0;
  93.             kill(pp, SIGALRM);
  94.         }
  95.         _exit(0);
  96.     }
  97.    
  98.     p2 = fork();
  99.     if(!p2) {
  100.         int fd = open(argv[1], O_RDONLY);
  101.         char c;
  102.  
  103.         struct sigaction alr;
  104.         sigemptyset(&alr.sa_mask);
  105.         alr.sa_handler = flg;
  106.         alr.sa_flags = SA_RESTART;
  107.         sigaction(SIGALRM, &alr, NULL);
  108.  
  109.         sigprocmask(SIG_UNBLOCK, &pps, NULL);
  110.         while(read(fd, &c, sizeof(c) == sizeof(c))) {
  111.             for(int i = CHAR_BIT - 1; i >= 0; --i) {
  112.                 if(c >> i & 1) {
  113.                     kill(p1, SIGUSR2);
  114.                 } else {
  115.                     kill(p1, SIGUSR1);
  116.                 }
  117.                 while(!flag1);
  118.                 flag1 = 0;
  119.             }
  120.         }
  121.         close(fd);
  122.         kill(p1, SIGIO);
  123.         _exit(0);
  124.     }
  125.  
  126.     sigprocmask(SIG_UNBLOCK, &pps, NULL);
  127.     while(1) {
  128.         pause();
  129.     }
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement