Advertisement
wowonline

Untitled

Dec 11th, 2021
767
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <signal.h>
  2. #include <sys/types.h>
  3. #include <sys/wait.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <stdio.h>
  7. #include <signal.h>
  8.  
  9. enum { INTEGER_BASE = 10 };
  10.  
  11. volatile sig_atomic_t flag = 0;
  12.  
  13. void
  14. handler(int s)
  15. {
  16.     flag = 1;
  17. }
  18.  
  19. void
  20. work(int serial, FILE *p1, FILE *p2, int maximum)
  21. {
  22.     pid_t pid;
  23.  
  24.     int val;
  25.     while (1) {
  26.         sigset_t s2;
  27.         sigemptyset(&s2);
  28.         while (!flag) {
  29.             sigsuspend(&s2);
  30.         }
  31.         flag = 0;
  32.         fscanf(p1, "%d", &pid);
  33.         if (pid == -1) {
  34.             break;
  35.         }
  36.         fscanf(p1, "%d", &val);
  37.  
  38.         if (val >= maximum) {
  39.             fprintf(p2, "%d\n", -1);
  40.             kill(pid, SIGUSR1);
  41.             break;
  42.         }
  43.         printf("%d %d\n", serial, val);
  44.         fflush(stdout);
  45.         fprintf(p2, "%d\n", getpid());
  46.         fflush(p2);
  47.         fprintf(p2, "%d\n", val+1);
  48.         fflush(p2);
  49.         kill(pid, SIGUSR1);
  50.        
  51.     }
  52.     fclose(p1);
  53.     fclose(p2);
  54.     _exit(0);
  55. }
  56. pid_t
  57. execute(int ser, FILE *f1_r, FILE *f1_w, int maximum)
  58. {
  59.     pid_t pid = fork();
  60.     if (pid == -1) {
  61.         _exit(1);
  62.     } else if (!pid) {
  63.         work(ser, f1_r, f1_w, maximum);
  64.         _exit(0);
  65.     }
  66.     return pid;
  67. }
  68.  
  69. int
  70. main(int argc, char *argv[])
  71. {
  72.     FILE *f1_r, *f1_w;
  73.     int p1[2], maximum, val = 1;
  74.     pid_t pid1, pid2;
  75.     pipe(p1);
  76.     f1_w = fdopen(p1[1], "w");
  77.     f1_r = fdopen(p1[0], "r");
  78.     maximum = strtol(argv[1], NULL, INTEGER_BASE);
  79.  
  80.     sigset_t s1;
  81.     sigemptyset(&s1);
  82.     sigaddset(&s1, SIGUSR1);
  83.     sigprocmask(SIG_BLOCK, &s1, NULL);
  84.     sigaction(SIGUSR1, &(struct sigaction){ .sa_handler = handler, .sa_flags = SA_RESTART }, NULL);
  85.  
  86.     pid1 = execute(1, f1_r, f1_w, maximum);
  87.    
  88.     /*
  89.     pid1 = fork();
  90.     if (pid1 == -1) {
  91.         return 1;
  92.     } else if (!pid1) {
  93.         work(1, f1_r, f1_w, maximum);
  94.         _exit(0);
  95.     }
  96.     */
  97.    
  98.    
  99.     pid2 = execute(2, f1_r, f1_w, maximum);
  100.    
  101.     /*
  102.     pid2 = fork();
  103.     if (pid2 == -1) {
  104.         return 1;
  105.     } else if (!pid2) {
  106.         work(2, f1_r, f1_w, maximum);
  107.         _exit(0);
  108.     }
  109.     */
  110.    
  111.     fprintf(f1_w, "%d\n", pid2);
  112.     fflush(f1_w);
  113.     fprintf(f1_w, "%d\n", val);
  114.     fflush(f1_w);
  115.     kill(pid1, SIGUSR1);
  116.  
  117.     fclose(f1_w);
  118.     fclose(f1_r);
  119.     waitpid(pid1, NULL, 0);
  120.     waitpid(pid2, NULL, 0);
  121.     printf("Done\n");
  122.     fflush(stdout);
  123. }
Advertisement
RAW Paste Data Copied
Advertisement