Gistrec

Управление ресурсами в ВЧ 5

Apr 1st, 2019
437
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.25 KB | None | 0 0
  1. /**
  2.  * Исходный процесс создает два программных канала К1 и К2
  3.  * Исходный процесс порождает два процесса Р1 и Р2
  4.  * Процесс P2 помещает некие данные в канал K1
  5.  * Процесс P1 читает данные из канала K1, обрабатывает их и помещает их в канал K2
  6.  * Родительский процесс читает данные из канала K2
  7.  */
  8.  
  9.  
  10. #include <stdio.h>  /** printf */
  11. #include <unistd.h> /** pipe, write */
  12. #include <sys/wait.h> /** wait, SIGINT */
  13. #include <assert.h> /** assert */
  14. #include <stdlib.h> /** strtol, exit, NULL */
  15.  
  16. #define PID_CHILD 0
  17.  
  18. int  first_fd[2]; // Создаем два
  19. int second_fd[2]; //  программных канала
  20.  
  21. int main() {
  22.     printf("[Родительский процесс] Я родился\n");
  23.  
  24.     // Создаем каналы для трех дочерних процессов
  25.     assert(pipe(first_fd)  != -1 && "Error: can't create pipe for first_fd");
  26.     assert(pipe(second_fd) != -1 && "Error: can't create pipe for second_fd");
  27.  
  28.  
  29.     int first_child = fork();
  30.     assert(first_child != -1 && "Can't create new process");
  31.     if (first_child == PID_CHILD) {
  32.         // Первый процесс
  33.         printf("[Дочерний процесс 1] Я родился и жду сигнала от дочернего процесса 2\n");
  34.  
  35.         signal(SIGINT, [](int signal) -> void {
  36.             printf("[Дочерний процесс 1] Получил сигнал от дочернего процесса 2\n");
  37.  
  38.             int data;
  39.             read(first_fd[0], (char *) &data,  sizeof(int));
  40.             printf("[Дочерний процесс 1] Считал число '%d' из канала 1\n", data);
  41.  
  42.             data = data + data;
  43.             printf("[Дочерний процесс 1] Посылаю обработанное число '%d' в канал 2\n", data);
  44.             write(second_fd[1], (char *) &data, sizeof(int));
  45.             exit(0);
  46.         });
  47.         pause();
  48.  
  49.         return 0;
  50.     }
  51.  
  52.     // Считаем k!
  53.     int second_child = fork();
  54.     assert(second_child != -1 && "Can't create new process");
  55.     if (second_child == PID_CHILD) {
  56.         // Второй процесс
  57.         int data = 5;
  58.         printf("[Дочерний процесс 2] Я родился и посылаю число '%d'  в канал 1\n", data);
  59.         write(first_fd[1], (char *) &data, sizeof(int));
  60.  
  61.         printf("[Дочерний процесс 2] Посылаю сигнал SIGINT дочернему процессу 1\n");
  62.         kill(first_child, SIGINT);
  63.         exit(0);
  64.     }
  65.  
  66.     // Ждем завершения работы все дочерних процессов
  67.     int status = 0;
  68.     while ((wait(&status)) > 0) {};
  69.     printf("[Родительский процесс] Все дочерние процессы завершены\n");
  70.  
  71.     int data;
  72.     read(second_fd[0],  &data,  sizeof(int));
  73.  
  74.     printf("[Родительский процесс] Считали из канала 2 данные: %d\n", data);
  75.  
  76.     exit(0);
  77. }
  78.  
  79.  
  80. /**
  81.  * Результат работы программы:
  82.  * [Родительский процесс] Я родился
  83.  * [Дочерний процесс 1] Я родился и жду сигнала от дочернего процесса 2
  84.  * [Дочерний процесс 2] Я родился и посылаю число '5'  в канал 1
  85.  * [Дочерний процесс 2] Посылаю сигнал SIGINT дочернему процессу 1
  86.  * [Дочерний процесс 1] Получил сигнал от дочернего процесса 2
  87.  * [Дочерний процесс 1] Считал число '5' из канала 1
  88.  * [Дочерний процесс 1] Посылаю обработанное число '10' в канал 2
  89.  * [Родительский процесс] Все дочерние процессы завершены
  90.  * [Родительский процесс] Считали из канала 2 данные: 10
  91.  */
Advertisement
Comments
  • User was banned
Add Comment
Please, Sign In to add comment