Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.02 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/wait.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <signal.h>
  8.  
  9. volatile sig_atomic_t flag = 0;
  10. int targetpid;
  11. int max;
  12.  
  13. void handler(int signal) {
  14.     flag = 1;
  15. }
  16.  
  17. void proc(FILE *fr, FILE *fw, int curr)
  18. {
  19.     int x;
  20.     while (1) {
  21.         while (!flag) {
  22.             pause();
  23.         }
  24.         flag = 0;
  25.         fscanf(fr, "%d", &x);
  26.         if (x >= max) {
  27.             break;
  28.         }
  29.         printf("%d %d\n", curr, x);
  30.         fflush(stdout);
  31.         x++;
  32.         fprintf(fw, "%d\n", x);
  33.         kill(targetpid, SIGUSR1);
  34.         fflush(fw);
  35.     }
  36.     fclose(fr);
  37.     fclose(fw);
  38. }
  39.  
  40. int main(int argc, char *argv[]) {
  41.  
  42.     max = strtol(argv[1], NULL, 10);
  43.     int fd[2];
  44.     pipe(fd);
  45.     FILE *fr = fdopen(fd[0], "r");
  46.     FILE *fw = fdopen(fd[1], "w");
  47.  
  48.     struct sigaction action =
  49.     {
  50.         .sa_handler = handler,
  51.         .sa_flags = SA_RESTART
  52.     };
  53.     sigaction(SIGUSR1, &action, NULL);
  54.     int pid1;
  55.     int pid2;
  56.  
  57.     if (!(pid1 = fork())) {
  58.         while (!flag) {
  59.             pause();
  60.         }
  61.         fscanf(fr, "%d", &targetpid);
  62.  
  63.         proc(fr, fw, 1);
  64.         close(fd[0]);
  65.         close(fd[1]);
  66.         exit(0);
  67.     }
  68.  
  69.     if (!(pid2 = fork())) {
  70.         while (!flag) {
  71.             pause();
  72.         }
  73.         flag = 0;
  74.  
  75.         fscanf(fr, "%d", &targetpid);
  76.         fprintf(fw, "%d\n", getpid());
  77.         fflush(fw);
  78.         fprintf(fw, "%d\n", 1);
  79.         fflush(fw);
  80.         kill(targetpid, SIGUSR1);
  81.  
  82.         proc(fr, fw, 2);
  83.         close(fd[0]);
  84.         close(fd[1]);
  85.         exit(0);
  86.     }
  87.  
  88.     fprintf(fw, "%d\n", pid1);
  89.     fflush(fw);
  90.     fclose(fr);
  91.     fclose(fw);
  92.     close(fd[1]);
  93.     close(fd[0]);
  94.     kill(pid2, SIGUSR1);
  95.    
  96.     int finish = wait(NULL);
  97.     if (finish == pid1) {
  98.         kill(pid2, SIGKILL);
  99.     } else {
  100.         kill(pid1, SIGKILL);
  101.     }
  102.     wait(NULL);
  103.     printf("Done\n");
  104.     fflush(stdout);
  105.     exit(0);
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement