Передо мной стоит вот такая задачка:
Родительский процесс создаёт программный канал (неименованный) и затем ветвится дважды. Родительский процесс пишет в канал 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);
}
Как читать из канала и записывать в него - я знаю.. Только вот не совсем понимаю, в какой конструкции в программе мне это писать (чтение из канала для каждого из потомков). В самих обработчиках сигналов или в местах выполнения дочерних процессов? Почему-то, когда я посылаю сигналы из родительского процесса, программа не входит в обработчики и ничего даже не печатает на экран.
Представленный выше код - это незавершенная программа. Так сказать, наброски (: