0 / 0 / 0
Регистрация: 07.06.2011
Сообщений: 4

C - программа использующая named pipes и fork

07.06.2011, 19:40. Показов 3564. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача - написать скрипт для вычисления тангенса заданного угла. Родительская программа получает аргумент ф-ции через параметр -p, затем создает дочерний процесс, заменяет текущий образ дочернего процесса на новый, который содержит код для вычисления тангенса.

Передача аргумента для тангенса дочернему процессу должна идти через named pipe. Потом возвращаем результат в родительский процесс и выводим в stdout.

ПРОБЛЕМА - дочерний код не выполняется почему-то.

parent.c:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#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);
}
child.c:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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);
    } 
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.06.2011, 19:40
Ответы с готовыми решениями:

Программа использующая математические функции
#include &lt;stdio. h&gt; #include &lt;conio. h&gt; #include &lt;math.h&gt; int main () { #define NMAX 1000 #define PI 3.14159 float xx, yy; ...

не компилируется fork: Undefined reference to fork
написал маленькую fork-бомбу #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { while(1) { fork(); printf(&quot;HELLO...

Named Pipes, создание чата
Добрый день, уважаемые форумчане! Есть написанный чат с использованием именованного канала, с ним вопросов нет). Имеется Server и Client....

6
 Аватар для denix
65 / 65 / 5
Регистрация: 11.01.2009
Сообщений: 130
07.06.2011, 19:47
проблема тут:

C
1
execl("./child.out", "child.out" , NULL);
код после этой строчки у тебя не выполниться, читай про семейство exec
1
0 / 0 / 0
Регистрация: 07.06.2011
Сообщений: 4
07.06.2011, 20:00  [ТС]
мерси за ответ, но... переделал код parent.c, чайлд запускается, но по-прежнему не читает послыаемые данные. огромная просьба ткнуть носом

переделал так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#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", "PARAM1", NULL);
    printf("Child program started\n");
    perror("EXEC:");
    exit(1);
    }
        
    // 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);
}
0
 Аватар для denix
65 / 65 / 5
Регистрация: 11.01.2009
Сообщений: 130
07.06.2011, 20:30
ошибок у тебя много, но главное - ты не понимаешь, что ты делаешь.

например, что это:
C
1
read(buffer, strlen(buffer), stdin);
?

разберись с pipe, пойми физику межпроцессорного взаимодействия.

как вариант, в твоем случае проще открыть pipe в child и вычитывать оттуда.
1
0 / 0 / 0
Регистрация: 07.06.2011
Сообщений: 4
07.06.2011, 21:29  [ТС]
denix, плиз, вкратце - нет доступа сейчас к консоли. я должен открыть пайп в дочернем процессе и читать из него? и, соответственно, писать в пайп в родительском?
0
 Аватар для denix
65 / 65 / 5
Регистрация: 11.01.2009
Сообщений: 130
07.06.2011, 21:49
Цитата Сообщение от lazybones Посмотреть сообщение
denix, плиз, вкратце - нет доступа сейчас к консоли. я должен открыть пайп в дочернем процессе и читать из него? и, соответственно, писать в пайп в родительском?
вызовом exec ты подменяешь контекст дочернего процесса, поэтому, все открытые файловые дескрипторы не будут доступны у тебя после вызова exec. соответственно, как вариант, в контексте нового исполнимого образа программы тебе,например, можно открыть pipe, который ты создал в родительском процессе и читать из него.
но смысла подменять дочерний процесс я не вижу. проще сделать все в дочернем процессе без exec. найди классический пример использования pipe и переделай под свою задачу. сложностей возникнуть не должно.

удачи
1
0 / 0 / 0
Регистрация: 07.06.2011
Сообщений: 4
07.06.2011, 21:54  [ТС]
благодарю, попробую.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2011, 21:54
Помогаю со студенческими работами здесь

Named pipes, GetFileSize и парсинг строки
Visual C++ 2010. Задача: из программы на C# передать некий список файлов в программу на C++. Передаётся строка вида...

Именованные каналы (Named Pipes). Не компилируется код
Всем добрый день. Я новичок в C++ и WinAPI, больше работаю с Java. Сейчас возникла необходимость в именованных каналах. Изучив...

Программа, использующая БД
Не как не могу разобраться с базами данных. Покажите пример или дайте ссылку на такой пример проги: Например прога связывается с базой...

Программа, использующая интернет
Появилась идея - дать программе доступ в интернет, как это реализовать, понятия не имею, помогите!

Программа, использующая gmlib, зависает
Буквально неделю назад все работало, рассчитывало путь, а теперь перестало, программа просто зависает, и приходится ее выключать через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru