C - программа использующая named pipes и fork - C (СИ)
Формулировка задачи:
Задача - написать скрипт для вычисления тангенса заданного угла. Родительская программа получает аргумент ф-ции через параметр -p, затем создает дочерний процесс, заменяет текущий образ дочернего процесса на новый, который содержит код для вычисления тангенса.
Передача аргумента для тангенса дочернему процессу должна идти через named pipe. Потом возвращаем результат в родительский процесс и выводим в stdout.
ПРОБЛЕМА - дочерний код не выполняется почему-то.
parent.c:
child.c:
#include <stdio.h> #include <signal.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> main(int argc, char *argv[]) { double marg; int childproc; double result; int sec; int mypipe; if(strcmp(argv[1], "-p") != 0) { printf("Wrong parameter. Please use \"-p\" to specify argument for TAN function\n"); return 0; } marg = strtod(argv[2], NULL); printf("Argumant of TAN function: %f\n", marg); if (marg == 0 && strcmp(argv[2], "0") != 0) printf("Incorrent argument for TAN function. Use digits to specify argument in radians with dot as separator.\n"); // create named pipe mypipe = mkfifo("lab_fifo", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); mypipe = open("./lab_fifo", O_RDWR); printf("Named pipe created.\n"); // create child process childproc = fork(); if (childproc == 0) { printf("Child process started\n"); // redirect input parent to a pipe and read child from pipe dup2(mypipe, 1); printf("DUP called successfully\n"); /* Exectute Child program */ execl("./child.out", "child.out" , NULL); printf("Child program started\n"); // write to pipe argument of TAN function write(mypipe, argv[2], strlen(argv[2])); write(mypipe, "EXITCHILD", strlen("EXITCHILD")); printf("We wrote to child program\n"); } exit(0); }
#include <stdio.h> #include <signal.h> #include <string.h> #include <stdlib.h> main(int argc, char *argv[]) { char buffer[1024]; printf("Child program started\n"); while(1) { read(buffer, strlen(buffer), stdin); if(strcmp(buffer, "EXITCHILD") == 0) { printf("BUFFER: %s", buffer); close(0); exit(0); } } }
Решение задачи: «C - программа использующая named pipes и fork»
textual
Листинг программы
read(buffer, strlen(buffer), stdin);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д