Advertisement
wowonline

Untitled

Dec 11th, 2021
1,020
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. pid_t pid1, pid2;
  13.  
  14. void
  15. handler(int s)
  16. {
  17.     flag = 1;
  18. }
  19.  
  20. void
  21. work(int serial, FILE *p1, FILE *p2, int maximum)
  22. {
  23.     pid_t pid;
  24.  
  25.     int val;
  26.     while (1) {
  27.         sigset_t s2;
  28.         sigemptyset(&s2);
  29.         while (!flag) {
  30.             sigsuspend(&s2);
  31.         }
  32.         flag = 0;
  33.         //fscanf(p1, "%d", &pid);
  34.         if (getpid() == pid1) {
  35.             pid = pid2;
  36.         } else {
  37.             pid = pid1;
  38.         }
  39.         if (pid == -1) {
  40.             break;
  41.         }
  42.         fscanf(p1, "%d", &val);
  43.  
  44.         if (val >= maximum) {
  45.             fprintf(p2, "%d\n", -1);
  46.             kill(pid, SIGUSR1);
  47.             break;
  48.         }
  49.         printf("%d %d\n", serial, val);
  50.         fflush(stdout);
  51.         //fprintf(p2, "%d\n", getpid());
  52.         //fflush(p2);
  53.         fprintf(p2, "%d\n", val+1);
  54.         fflush(p2);
  55.         kill(pid, SIGUSR1);
  56.     }
  57.     fclose(p1);
  58.     fclose(p2);
  59.     _exit(0);
  60. }
  61.  
  62. pid_t
  63. execute(int ser, FILE *f1_r, FILE *f1_w, int maximum)
  64. {
  65.     pid_t pid = fork();
  66.     if (pid == -1) {
  67.         _exit(1);
  68.     } else if (!pid) {
  69.         work(ser, f1_r, f1_w, maximum);
  70.         _exit(0);
  71.     }
  72.     return pid;
  73. }
  74.  
  75. int
  76. main(int argc, char *argv[])
  77. {
  78.     FILE *f1_r, *f1_w;
  79.     int p1[2], maximum, val = 1;
  80.     pipe(p1);
  81.     f1_w = fdopen(p1[1], "w");
  82.     f1_r = fdopen(p1[0], "r");
  83.     maximum = strtol(argv[1], NULL, INTEGER_BASE);
  84.  
  85.     sigset_t s1;
  86.     sigemptyset(&s1);
  87.     sigaddset(&s1, SIGUSR1);
  88.     sigprocmask(SIG_BLOCK, &s1, NULL);
  89.     sigaction(SIGUSR1, &(struct sigaction){ .sa_handler = handler, .sa_flags = SA_RESTART }, NULL);
  90.  
  91.     pid2 = execute(2, f1_r, f1_w, maximum);
  92.     pid1 = execute(1, f1_r, f1_w, maximum);
  93.    
  94.     fprintf(f1_w, "%d\n", pid2);
  95.     fflush(f1_w);
  96.     fprintf(f1_w, "%d\n", val);
  97.     fflush(f1_w);
  98.     kill(pid1, SIGUSR1);
  99.  
  100.     fclose(f1_w);
  101.     fclose(f1_r);
  102.     waitpid(pid1, NULL, 0);
  103.     waitpid(pid2, NULL, 0);
  104.     printf("Done\n");
  105.     fflush(stdout);
  106. }
  107.  
  108. //код частично позаимствован из конспектов
Advertisement
RAW Paste Data Copied
Advertisement