wowonline

Untitled

Nov 28th, 2021
653
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.     while (1) {
  17.         // сами данные нас не интересуют, важно, чтобы был фиксированный
  18.         int val;
  19.         // ожидаем своей очереди для работы
  20.         //read(p1, &val, sizeof(val));
  21.         fscanf(p1, "%d", &val);
  22.         // выводим свой порядковый номер
  23.         if (val >= maximum) {
  24.             _exit(0);
  25.         }
  26.         printf("%d %d\n", serial, val);
  27.         fflush(stdout);
  28.         // разрешаем работать другому процессу
  29.         fprintf(p2, "%d\n", val+1);
  30.         //write(p2, &val, sizeof(val));
  31.     }
  32. }
  33.  
  34. int
  35. main(int argc, char *argv[])
  36. {
  37.     FILE *f1_r, *f1_w, *f2_r, *f2_w;
  38.     int p1[2], p2[2], maximum;
  39.     pipe(p1);
  40.     pipe(p2);
  41.     f1_w = fdopen(p1[1], "w");
  42.     f2_r = fdopen(p2[0], "r");
  43.     f1_r = fdopen(p1[0], "r");
  44.     f2_w = fdopen(p2[1], "w");
  45.     maximum = strtol(argv[1], NULL, INTEGER_BASE);
  46.  
  47.     if (!fork()) {
  48.         work(1, f1_r, f2_w, maximum);
  49.         _exit(0);
  50.     }
  51.     if (!fork()) {
  52.         work(2, f2_r, f1_w, maximum);
  53.         _exit(0);
  54.     }
  55.    
  56.     fprintf(f1_r, "%d\n", 1);
  57.     fclose(f1_r);
  58.     fclose(f2_r);
  59.     fclose(f1_w);
  60.     fclose(f2_w);
  61.     wait(NULL);
  62.     printf("Done\n");
  63.     fflush(stdout);
  64. }
RAW Paste Data