Пересылка символов по неименованному каналу от родителя к двум потомкам. (помогите решить простуую задачу плиз (:)

Модератор: Модераторы разделов

Аватара пользователя
Morozeg
Сообщения: 7
ОС: eeebuntu

Пересылка символов по неименованному каналу от родителя к двум потомкам.

Сообщение Morozeg »

Доброго времени суток всем!

Передо мной стоит вот такая задачка:

Родительский процесс создаёт программный канал (неименованный) и затем ветвится дважды. Родительский процесс пишет в канал 10 символов. Если это сообщение для 1-го потомка, то ему (1-му) посылается сигнал SIGUSR1, если это сообщение для 2-го потомка, то 2-му посылается сигнал SIGUSR2. По получении сигнала, потомок читает из канала 10 символов и выводит на экран.
Родитель выбирает одного из потомков случайным образом, осуществляет запись и засыпает на 3 секунды, затем всё повторяется.

Вот что я накатал на данный момент:

Код: Выделить всё

#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <wait.h>

static void sigu1() // обработчик сигнала 1
    {
        signal(SIGUSR1,sigu1);
        printf("SIGUSR1");
    }

static void sigu2() // обработчик сигнала 2
    {
        signal(SIGUSR2,sigu2);
        printf("SIGUSR2");
    }

int main()
{

pid_t childpid1; // PID потомка 1
pid_t childpid2; // PID потомка 2
int fd[2];
pipe(fd); // неименованный канал
int i=0;
char buf[10]={0,1,2,3,4,5,6,7,8,9}; // буфер для отсылки в канал

signal(SIGUSR1,sigu1);
signal(SIGUSR2,sigu2);

childpid1=fork();
if(childpid1==0)
    {
            // выполняется потомок 1
    }
if(childpid1>0)
    {
        childpid2=fork(); // потомок 2
        if(childpid2==0)
            {
                // выполняется потомок 2
            }
        if(childpid2>0)
            {
                for(i=0;i<10;i++)      // 10 записей в канал родительским процессом
                      {
                    if((rand()%2)==0) // посылаем сигнал SIGUSR1
                        {
                        kill(childpid1,SIGUSR1);
                        }
                    else    // посылаем сигнал SIGUSR2
                        {
                        kill (childpid2,SIGUSR2);
                        }
                    sleep(3);
                    }
            }
    }
exit(1);
}


Как читать из канала и записывать в него - я знаю.. Только вот не совсем понимаю, в какой конструкции в программе мне это писать (чтение из канала для каждого из потомков). В самих обработчиках сигналов или в местах выполнения дочерних процессов? Почему-то, когда я посылаю сигналы из родительского процесса, программа не входит в обработчики и ничего даже не печатает на экран.

Представленный выше код - это незавершенная программа. Так сказать, наброски (:
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: Пересылка символов по неименованному каналу от родителя к двум потомкам.

Сообщение Red User »

Попробуй добавить в конец выводимых обработчиками строк '\n'
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
Аватара пользователя
Morozeg
Сообщения: 7
ОС: eeebuntu

Re: Пересылка символов по неименованному каналу от родителя к двум потомкам.

Сообщение Morozeg »

Red User писал(а):
23.05.2009 04:06
Попробуй добавить в конец выводимых обработчиками строк '\n'

и чего будет? они просто будут печататься с переводом строки и всё.. :mellow:
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: Пересылка символов по неименованному каналу от родителя к двум потомкам.

Сообщение Denjs »

Morozeg писал(а):
23.05.2009 08:59
Red User писал(а):
23.05.2009 04:06
Попробуй добавить в конец выводимых обработчиками строк '\n'

и чего будет? они просто будут печататься с переводом строки и всё.. :mellow:

я так понял, "телепат 'Red User' как-бе намекаэ", (дает мысленную установку на прием) что '\n' - часто воспринимается как управляющий символ.... и "хто его знае"... кдруг вы там какой режим чтения по строкам инициировали - пока конец строки не обозначите - данные не отправятся и/или не примутся...

ну а я бы ещё добавил логов всяких до кучи, что бы понимать где как что работает...
кроме того, я конечно не работал с именованными каналами и т.п. механизмами (сигнал-слот- вот наше все) - я чего-то не заметил у вас никаких циклов ожидания для получения данных... мне кажется или нет, что второй и третий поток просто проваливаются "сквозь все", благополучно добираются до exit(1) и радостно("отмучались наконец!") канают в небытие... а уже только после этого сигнал приходит... куда приходит? к кому?

ЛОГИ! логи, молодй человек. Не имеете возможности пользоваться отладчиком - вставляйте в программу printf("[номерстроки исходника]Control point reached!"); - если не понимаете что и как там оно у нутрях работает....
Вставьте такой мессадж с указанием номера строки в нем и разных местах программы - и перед выходом тоже, и следите за появляющимися сообщениями...
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали: