Advertisement
wowonline

Untitled

Dec 11th, 2021
718
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.     }
  58.     fclose(p1);
  59.     fclose(p2);
  60.     _exit(0);
  61. }
  62.  
  63. void
  64. execute(int ser, FILE *f1_r, FILE *f1_w, int maximum)
  65. {
  66.     pid_t pid = fork();
  67.     if (pid == -1) {
  68.         _exit(1);
  69.     } else if (!pid) {
  70.         if (ser == 1) {
  71.             pid1 = getpid();
  72.         } else {
  73.             pid2 = getpid();
  74.         }
  75.         work(ser, f1_r, f1_w, maximum);
  76.         _exit(0);
  77.     }
  78.     return;
  79. }
  80.  
  81. int
  82. main(int argc, char *argv[])
  83. {
  84.     FILE *f1_r, *f1_w;
  85.     int p1[2], maximum, val = 1;
  86.     pipe(p1);
  87.     f1_w = fdopen(p1[1], "w");
  88.     f1_r = fdopen(p1[0], "r");
  89.     maximum = strtol(argv[1], NULL, INTEGER_BASE);
  90.  
  91.     sigset_t s1;
  92.     sigemptyset(&s1);
  93.     sigaddset(&s1, SIGUSR1);
  94.     sigprocmask(SIG_BLOCK, &s1, NULL);
  95.     sigaction(SIGUSR1, &(struct sigaction){ .sa_handler = handler, .sa_flags = SA_RESTART }, NULL);
  96.  
  97.     execute(1, f1_r, f1_w, maximum);
  98.     execute(2, f1_r, f1_w, maximum);
  99.    
  100.     //fprintf(f1_w, "%d\n", pid2);
  101.     //fflush(f1_w);
  102.     fprintf(f1_w, "%d\n", val);
  103.     fflush(f1_w);
  104.     kill(pid1, SIGUSR1);
  105.  
  106.     fclose(f1_w);
  107.     fclose(f1_r);
  108.     waitpid(pid1, NULL, 0);
  109.     waitpid(pid2, NULL, 0);
  110.     printf("Done\n");
  111.     fflush(stdout);
  112. }
  113.  
  114. //код частично позаимствован из конспектов
Advertisement
RAW Paste Data Copied
Advertisement