Advertisement
Guest User

Untitled

a guest
Apr 21st, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.05 KB | None | 0 0
  1. #include <err.h>
  2. #include <signal.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <sys/signalfd.h>
  6. #include <sys/types.h>
  7. #include <sys/wait.h>
  8. #include <unistd.h>
  9.  
  10. void child_main(int id, int pipefd[2], int n) {
  11.     printf("hi %d\n", id);
  12.     fflush(stdout);
  13.     sigset_t mask;
  14.     sigemptyset(&mask);
  15.     sigaddset(&mask, SIGUSR1);
  16.     int sigfd = signalfd(-1, &mask, 0);
  17.     struct signalfd_siginfo siginfo;
  18.  
  19.     char buf[64];
  20.  
  21.     read(sigfd, &siginfo, sizeof siginfo);
  22.     read(pipefd[0], buf, sizeof buf);
  23.     pid_t other;
  24.     {
  25.         uintmax_t tmp;
  26.         sscanf(buf, "%ju", &tmp);
  27.         other = tmp;
  28.     }
  29.  
  30.     for (;;) {
  31.         read(sigfd, &siginfo, sizeof siginfo);
  32.         read(pipefd[0], buf, sizeof buf);
  33.         int num;
  34.         sscanf(buf, "%d", &num);
  35.         if (num > n)
  36.             break;
  37.         printf("%d %d\n", id, num);
  38.         fflush(stdout);
  39.  
  40.         sprintf(buf, "%d", num+1);
  41.         kill(other, SIGUSR1);
  42.         write(pipefd[1], buf, sizeof buf);
  43.         if (num == n)
  44.             break;
  45.     }
  46.  
  47.     exit(0);
  48. }
  49.  
  50. int main(int argc, char **argv) {
  51.     if (argc < 2)
  52.         errx(1, "Usage: %s N", argv[0]);
  53.  
  54.     int n;
  55.     sscanf(argv[1], "%d", &n);
  56.  
  57.     int pipefd[2];
  58.     if (pipe(pipefd) == -1)
  59.         err(1, "pipe() failed");
  60.  
  61.     pid_t child1 = fork();
  62.     if (child1 == -1)
  63.         err(1, "fork() failed");
  64.     if (child1 == 0)
  65.         child_main(1, pipefd, n);
  66.  
  67.     pid_t child2 = fork();
  68.     if (child2 == -1)
  69.         err(1, "fork() failed");
  70.     if (child2 == 0)
  71.         child_main(2, pipefd, n);
  72.  
  73.     char buf[64];
  74.  
  75.     sprintf(buf, "%ju", (uintmax_t) child2);
  76.     kill(child1, SIGUSR1);
  77.     write(pipefd[1], buf, sizeof buf);
  78.  
  79.     sprintf(buf, "%ju", (uintmax_t) child1);
  80.     kill(child2, SIGUSR1);
  81.     write(pipefd[1], buf, sizeof buf);
  82.  
  83.     kill(child1, SIGUSR1);
  84.     sprintf(buf, "1");
  85.     write(pipefd[1], buf, sizeof buf);
  86.  
  87.     close(pipefd[0]);
  88.     close(pipefd[1]);
  89.  
  90.     waitpid(child1, NULL, 0);
  91.     waitpid(child2, NULL, 0);
  92.  
  93.     exit(0);
  94. }
  95. sm19/5.c
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement