Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Передача данных через канал
- // Не нужно, но сохранил
- //
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <assert.h>
- #include <sys/wait.h>
- #define CHILD 0
- /**
- * Разработать программу, вычисляющую число сочетаний C(k,n)=n!/(k!*(n-k)!)
- * Для вычисления факториалов n!, k!, (n-k)! должны быть порождены три параллельных процесса-потомка.
- */
- int fact(int N) {
- if(N < 0) return 0;
- if (N == 0) return 1;
- else return N * fact(N - 1);
- }
- int main() {
- int n_fd[2]; // Создаем по две дескриптора
- int k_fd[2]; // input && output
- int nk_fd[2]; // для трех дочерних процессов
- // Создаем каналы для трех дочерних процессов
- assert(pipe(n_fd) != -1 && "Error: can't create pipe for n_fd");
- assert(pipe(k_fd) != -1 && "Error: can't create pipe for k_fd");
- assert(pipe(nk_fd) != -1 && "Error: can't create pipe for nk_fd");
- int n = 4;
- int k = 2;
- int pid = fork();
- if (pid == CHILD) {
- int result = fact(n);
- printf("n! = %d\n", result);
- write(n_fd[1], &result, sizeof(int));
- return 0;
- }
- // Считаем k!
- pid = fork();
- if (pid == CHILD) {
- int result = fact(k);
- printf("k! = %d\n", result);
- write(k_fd[1], &result, sizeof(int));
- return 0;
- }
- // Считаем (nk)!
- pid = fork();
- if (pid == CHILD) {
- int result = fact(n - k);
- printf("(nk)! = %d\n", fact(n - k));
- write(nk_fd[1], &result, sizeof(int));
- return 0;
- }
- //sleep(3);
- int status = 0;
- while ((pid = wait(&status)) > 0);
- int n_fact;
- int k_fact;
- int nk_fact;
- read(n_fd[0], &n_fact, sizeof(int));
- read(k_fd[0], &k_fact, sizeof(int));
- read(nk_fd[0], &nk_fact, sizeof(int));
- printf("Result: %d\n", n_fact / (k_fact * nk_fact));
- return 0;
- }
- //
- // Передача данных через временный файл
- // Первое задание
- //
Advertisement