Gistrec

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

Mar 4th, 2019
268
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. //
  2. // Передача данных через канал
  3. // Не нужно, но сохранил
  4. //
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <sys/types.h>
  10. #include <assert.h>
  11. #include <sys/wait.h>
  12.  
  13. #define CHILD 0
  14.  
  15. /**
  16.  * Разработать программу, вычисляющую число сочетаний C(k,n)=n!/(k!*(n-k)!)
  17.  * Для вычисления факториалов n!, k!, (n-k)! должны быть порождены три параллельных процесса-потомка.
  18.  */
  19.  
  20. int fact(int N) {
  21.     if(N < 0) return 0;
  22.     if (N == 0) return 1;
  23.     else return N * fact(N - 1);
  24. }
  25.  
  26. int main() {
  27.     int  n_fd[2]; // Создаем по две дескриптора
  28.     int  k_fd[2]; //   input && output
  29.     int nk_fd[2]; //      для трех дочерних процессов
  30.  
  31.     // Создаем каналы для трех дочерних процессов
  32.     assert(pipe(n_fd)  != -1 && "Error: can't create pipe for n_fd");
  33.     assert(pipe(k_fd)  != -1 && "Error: can't create pipe for k_fd");
  34.     assert(pipe(nk_fd) != -1 && "Error: can't create pipe for nk_fd");
  35.  
  36.     int n = 4;
  37.     int k = 2;
  38.  
  39.  
  40.     int pid = fork();
  41.     if (pid == CHILD) {
  42.         int result = fact(n);
  43.  
  44.         printf("n! = %d\n", result);
  45.         write(n_fd[1], &result, sizeof(int));
  46.  
  47.         return 0;
  48.     }
  49.  
  50.     // Считаем k!
  51.     pid = fork();
  52.     if (pid == CHILD) {
  53.         int result = fact(k);
  54.  
  55.         printf("k! = %d\n", result);
  56.         write(k_fd[1], &result, sizeof(int));
  57.  
  58.         return 0;
  59.     }
  60.  
  61.     // Считаем (nk)!
  62.     pid = fork();
  63.     if (pid == CHILD) {
  64.         int result = fact(n - k);
  65.  
  66.         printf("(nk)! = %d\n", fact(n - k));
  67.         write(nk_fd[1], &result, sizeof(int));
  68.  
  69.         return 0;
  70.     }
  71.  
  72.      //sleep(3);
  73.     int status = 0;
  74.     while ((pid = wait(&status)) > 0);
  75.  
  76.     int n_fact;
  77.     int k_fact;
  78.     int nk_fact;
  79.     read(n_fd[0],  &n_fact,  sizeof(int));
  80.     read(k_fd[0],  &k_fact,  sizeof(int));
  81.     read(nk_fd[0], &nk_fact, sizeof(int));
  82.  
  83.     printf("Result: %d\n", n_fact / (k_fact * nk_fact));
  84.  
  85.     return 0;
  86. }
  87.  
  88.  
  89.  
  90. //
  91. // Передача данных через временный файл
  92. // Первое задание
  93. //
Advertisement
Comments
  • User was banned
Add Comment
Please, Sign In to add comment