Gistrec

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

Apr 1st, 2019
302
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.92 KB | None | 0 0
  1. /**
  2.  * Считаем число сочетаний C(k,n)=n!/(k!*(n-k)!)
  3.  * Для этого разработали программу Factorial.cpp, которая считает факториал
  4.  * и записывает его в файловый дескриптор, переданный в параметрах
  5.  */
  6.  
  7.  
  8. ///
  9. /// Файл Factorial.cpp
  10. ///
  11. #include <stdio.h>  /** printf */
  12. #include <stdlib.h> /** strtol, exit, NULL */
  13. #include <unistd.h> /** write */
  14. #include <sys/wait.h> /** SIGINT */
  15.  
  16. int fd;     // Файловый дескриптор, куда записывать результат
  17. int result; // Результат вычисления факториала
  18.  
  19. int fact(int N) {
  20.     if(N < 0) return 0;
  21.     if (N == 0) return 1;
  22.     else return N * fact(N - 1);
  23. }
  24.  
  25. /**
  26.  * Обработчик сигнала SIGINT
  27.  * Записываем в файловый дескриптор результат вычисления факториала
  28.  */
  29. void handleSignal(int signal) {
  30.     write(fd, (char *) &result, sizeof(int));
  31.     exit(0);
  32. }
  33.  
  34. int main(int argc, char *argv[]) {
  35.     signal(SIGINT, handleSignal);
  36.  
  37.     int n  = *(argv[0]);
  38.     fd = *argv[1];
  39.     result = fact(n);
  40.  
  41.     printf("[Дочерний процесс] %d! = %d\n", n, result);
  42.  
  43.     pause();
  44.     return 0;
  45. }
  46.  
  47.  
  48.  
  49.  
  50. ///
  51. /// Файл Main.cpp
  52. ///
  53.  
  54. #include <stdio.h>   /** printf */
  55. #include <unistd.h>  /** pipe */
  56. #include <sys/wait.h> /** wait */
  57. #include <assert.h>   /** assert */
  58.  
  59. #define PID_CHILD 0
  60.  
  61. /**
  62.  * Разработать программу, вычисляющую число сочетаний C(k,n)=n!/(k!*(n-k)!)
  63.  * Для вычисления факториалов n!, k!, (n-k)! должны быть порождены три параллельных процесса-потомка.
  64.  */
  65.  
  66. int main() {
  67.     int k = 2;
  68.     int n = 4;
  69.  
  70.     int  n_fd[2]; // Создаем по две дескриптора
  71.     int  k_fd[2]; //   input && output
  72.     int nk_fd[2]; //      для трех дочерних процессов
  73.  
  74.  
  75.     // Создаем каналы для трех дочерних процессов
  76.     assert(pipe(n_fd)  != -1 && "Error: can't create pipe for n_fd");
  77.     assert(pipe(k_fd)  != -1 && "Error: can't create pipe for k_fd");
  78.     assert(pipe(nk_fd) != -1 && "Error: can't create pipe for nk_fd");
  79.  
  80.  
  81.     int n_pid = fork();
  82.     assert(n_pid != -1 && "Can't create new process");
  83.     if (n_pid == PID_CHILD) {
  84.         // Заменяем программу новой
  85.         execl("/home/alex/CLionProjects/Fork/cmake-build-debug/Factorial", (char *) &n, (char *) &n_fd[1], (char *) NULL);
  86.     }
  87.  
  88.     // Считаем k!
  89.     int k_pid = fork();
  90.     assert(k_pid != -1 && "Can't create new process");
  91.     if (k_pid == PID_CHILD) {
  92.         execl("/home/alex/CLionProjects/Fork/cmake-build-debug/Factorial", (char *) &k, (char *) &k_fd[1], (char *) NULL);
  93.     }
  94.  
  95.     // Считаем (nk)!
  96.     int nk_pid = fork();
  97.     assert(nk_pid != -1 && "Can't create new process");
  98.     if (nk_pid == PID_CHILD) {
  99.         int tmp = n - k;
  100.         execl("/home/alex/CLionProjects/Fork/cmake-build-debug/Factorial", (char *) &tmp, (char *) &nk_fd[1], (char *) NULL);
  101.     }
  102.  
  103.     usleep(300000); // Даем время дочерним процессам подсчитать факториал
  104.  
  105.     kill(n_pid, SIGINT);
  106.     kill(k_pid, SIGINT);
  107.     kill(nk_pid, SIGINT);
  108.  
  109.     // Ждем завершения работы все дочерних процессов
  110.     int status = 0;
  111.     while ((wait(&status)) > 0) {};
  112.  
  113.     int n_fact;
  114.     int k_fact;
  115.     int nk_fact;
  116.     read(n_fd[0],  &n_fact,  sizeof(int));
  117.     read(k_fd[0],  &k_fact,  sizeof(int));
  118.     read(nk_fd[0], &nk_fact, sizeof(int));
  119.  
  120.     printf("[Родительский процесс] Результат: %d\n", n_fact / (k_fact * nk_fact));
  121.     return 0;
  122. }
Advertisement
Comments
  • User was banned
Add Comment
Please, Sign In to add comment