Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Считаем число сочетаний C(k,n)=n!/(k!*(n-k)!)
- * Для этого разработали программу Factorial.cpp, которая считает факториал
- * и записывает его в файловый дескриптор, переданный в параметрах
- */
- ///
- /// Файл Factorial.cpp
- ///
- #include <stdio.h> /** printf */
- #include <stdlib.h> /** strtol, exit, NULL */
- #include <unistd.h> /** write */
- #include <sys/wait.h> /** SIGINT */
- int fd; // Файловый дескриптор, куда записывать результат
- int result; // Результат вычисления факториала
- int fact(int N) {
- if(N < 0) return 0;
- if (N == 0) return 1;
- else return N * fact(N - 1);
- }
- /**
- * Обработчик сигнала SIGINT
- * Записываем в файловый дескриптор результат вычисления факториала
- */
- void handleSignal(int signal) {
- write(fd, (char *) &result, sizeof(int));
- exit(0);
- }
- int main(int argc, char *argv[]) {
- signal(SIGINT, handleSignal);
- int n = *(argv[0]);
- fd = *argv[1];
- result = fact(n);
- printf("[Дочерний процесс] %d! = %d\n", n, result);
- pause();
- return 0;
- }
- ///
- /// Файл Main.cpp
- ///
- #include <stdio.h> /** printf */
- #include <unistd.h> /** pipe */
- #include <sys/wait.h> /** wait */
- #include <assert.h> /** assert */
- #define PID_CHILD 0
- /**
- * Разработать программу, вычисляющую число сочетаний C(k,n)=n!/(k!*(n-k)!)
- * Для вычисления факториалов n!, k!, (n-k)! должны быть порождены три параллельных процесса-потомка.
- */
- int main() {
- int k = 2;
- int n = 4;
- 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_pid = fork();
- assert(n_pid != -1 && "Can't create new process");
- if (n_pid == PID_CHILD) {
- // Заменяем программу новой
- execl("/home/alex/CLionProjects/Fork/cmake-build-debug/Factorial", (char *) &n, (char *) &n_fd[1], (char *) NULL);
- }
- // Считаем k!
- int k_pid = fork();
- assert(k_pid != -1 && "Can't create new process");
- if (k_pid == PID_CHILD) {
- execl("/home/alex/CLionProjects/Fork/cmake-build-debug/Factorial", (char *) &k, (char *) &k_fd[1], (char *) NULL);
- }
- // Считаем (nk)!
- int nk_pid = fork();
- assert(nk_pid != -1 && "Can't create new process");
- if (nk_pid == PID_CHILD) {
- int tmp = n - k;
- execl("/home/alex/CLionProjects/Fork/cmake-build-debug/Factorial", (char *) &tmp, (char *) &nk_fd[1], (char *) NULL);
- }
- usleep(300000); // Даем время дочерним процессам подсчитать факториал
- kill(n_pid, SIGINT);
- kill(k_pid, SIGINT);
- kill(nk_pid, SIGINT);
- // Ждем завершения работы все дочерних процессов
- int status = 0;
- while ((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("[Родительский процесс] Результат: %d\n", n_fact / (k_fact * nk_fact));
- return 0;
- }
Advertisement