wowonline

Untitled

Nov 29th, 2021
705
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. // serial - порядковый номер процесса-сына (1, 2)
  7. #include <stdio.h>
  8. // rfd - для ожидания своей очереди вывода
  9. // wfd - для уведомления другого процесса
  10.  
  11. enum { INTEGER_BASE = 10 };
  12.  
  13. void
  14. work(int serial, FILE *p1, FILE *p2, int maximum)
  15. {
  16.     int val;
  17.     while (fscanf(p1, "%d", &val) == 1) {
  18.         // сами данные нас не интересуют, важно, чтобы был фиксированный
  19.        
  20.         // ожидаем своей очереди для работы
  21.         //read(p1, &val, sizeof(val));
  22.         //fscanf(p1, "%d", &val);
  23.         // выводим свой порядковый номер
  24.         if (val >= maximum) {
  25.             fclose(p1);
  26.             fprintf(p2, "%d\n", val);
  27.             fflush(p2);
  28.             fclose(p2);
  29.             _exit(0);
  30.         }
  31.         printf("%d %d\n", serial, val);
  32.         fflush(stdout);
  33.         val++;
  34.         // разрешаем работать другому процессу
  35.         fprintf(p2, "%d\n", val);
  36.         fflush(p2);
  37.         //write(p2, &val, sizeof(val));
  38.     }
  39. }
  40.  
  41. int
  42. main(int argc, char *argv[])
  43. {
  44.     FILE *f1_r, *f1_w, *f2_r, *f2_w;
  45.     int p1[2], p2[2], maximum, val = 1;
  46.     pid_t pid1, pid2;
  47.     pipe(p1);
  48.     pipe(p2);
  49.     f1_w = fdopen(p1[1], "w");
  50.     f2_r = fdopen(p2[0], "r");
  51.     f1_r = fdopen(p1[0], "r");
  52.     f2_w = fdopen(p2[1], "w");
  53.     maximum = strtol(argv[1], NULL, INTEGER_BASE);
  54.  
  55.     fprintf(f1_r, "%d\n", val);
  56.     fflush(f1_r);
  57.  
  58.     pid1 = fork();
  59.     if (pid1 == -1) {
  60.         return 1;
  61.     } else if (!pid1) {
  62.         fclose(f2_r);
  63.         fclose(f1_w);
  64.         work(1, f1_r, f2_w, maximum);
  65.         _exit(0);
  66.     }
  67.    
  68.     pid2 = fork();
  69.     if (pid2 == -1) {
  70.         return 1;
  71.     } else if (!pid2) {
  72.         fclose(f1_r);
  73.         fclose(f2_w);
  74.         work(2, f2_r, f1_w, maximum);
  75.         _exit(0);
  76.     }
  77.    
  78.     fclose(f2_r);
  79.     fclose(f1_w);
  80.     fclose(f2_w);
  81. //
  82.     fclose(f1_r);
  83.     waitpid(pid1, NULL, 0);
  84.     waitpid(pid2, NULL, 0);
  85.     printf("Done\n");
  86.     fflush(stdout);
  87. }
RAW Paste Data