Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Исходный процесс создает два программных канала К1 и К2
- * Исходный процесс порождает два процесса Р1 и Р2
- * Процесс P2 помещает некие данные в канал K1
- * Процесс P1 читает данные из канала K1, обрабатывает их и помещает их в канал K2
- * Родительский процесс читает данные из канала K2
- */
- #include <stdio.h> /** printf */
- #include <unistd.h> /** pipe, write */
- #include <sys/wait.h> /** wait, SIGINT */
- #include <assert.h> /** assert */
- #include <stdlib.h> /** strtol, exit, NULL */
- #define PID_CHILD 0
- int first_fd[2]; // Создаем два
- int second_fd[2]; // программных канала
- int main() {
- printf("[Родительский процесс] Я родился\n");
- // Создаем каналы для трех дочерних процессов
- assert(pipe(first_fd) != -1 && "Error: can't create pipe for first_fd");
- assert(pipe(second_fd) != -1 && "Error: can't create pipe for second_fd");
- int first_child = fork();
- assert(first_child != -1 && "Can't create new process");
- if (first_child == PID_CHILD) {
- // Первый процесс
- printf("[Дочерний процесс 1] Я родился и жду сигнала от дочернего процесса 2\n");
- signal(SIGINT, [](int signal) -> void {
- printf("[Дочерний процесс 1] Получил сигнал от дочернего процесса 2\n");
- int data;
- read(first_fd[0], (char *) &data, sizeof(int));
- printf("[Дочерний процесс 1] Считал число '%d' из канала 1\n", data);
- data = data + data;
- printf("[Дочерний процесс 1] Посылаю обработанное число '%d' в канал 2\n", data);
- write(second_fd[1], (char *) &data, sizeof(int));
- exit(0);
- });
- pause();
- return 0;
- }
- // Считаем k!
- int second_child = fork();
- assert(second_child != -1 && "Can't create new process");
- if (second_child == PID_CHILD) {
- // Второй процесс
- int data = 5;
- printf("[Дочерний процесс 2] Я родился и посылаю число '%d' в канал 1\n", data);
- write(first_fd[1], (char *) &data, sizeof(int));
- printf("[Дочерний процесс 2] Посылаю сигнал SIGINT дочернему процессу 1\n");
- kill(first_child, SIGINT);
- exit(0);
- }
- // Ждем завершения работы все дочерних процессов
- int status = 0;
- while ((wait(&status)) > 0) {};
- printf("[Родительский процесс] Все дочерние процессы завершены\n");
- int data;
- read(second_fd[0], &data, sizeof(int));
- printf("[Родительский процесс] Считали из канала 2 данные: %d\n", data);
- exit(0);
- }
- /**
- * Результат работы программы:
- * [Родительский процесс] Я родился
- * [Дочерний процесс 1] Я родился и жду сигнала от дочернего процесса 2
- * [Дочерний процесс 2] Я родился и посылаю число '5' в канал 1
- * [Дочерний процесс 2] Посылаю сигнал SIGINT дочернему процессу 1
- * [Дочерний процесс 1] Получил сигнал от дочернего процесса 2
- * [Дочерний процесс 1] Считал число '5' из канала 1
- * [Дочерний процесс 1] Посылаю обработанное число '10' в канал 2
- * [Родительский процесс] Все дочерние процессы завершены
- * [Родительский процесс] Считали из канала 2 данные: 10
- */
Advertisement