родитель порождает несколько потомков, нужно организовать между ними обмен данными такого типа: каждый потомок отправляет родителю сообщение, а родитель это сообщение пересылает всем остальным (или вообще всем) потомкам.
Второй вариант: любой потомок отправляет сообщене всем своим собратьям минуя родителя.Пробовал делать через сокет, тогда получается что потомки могут отправить родителю данные через сокет, а родитель используя этот сокет отправляет только одному из потомков, последнему который с ним связался, а все остальные ничего не получают.
Через пайпы то же самое.
Через именованный канал тоже только один но случайный потомок получает сообщение.
Через файл что-то получилось, но есть пара минусов: обмен происходит через хранящийся на диске файл, а не через память, и второе: потомки при считывании конца файла не ждут записи в него как если использовать пайп, приходится в цикле многократно считывать из файла пока в него не будет записано, а как сделать ожидание я не знаю.
Подскажите может есть другие идеи как организовать обмен?
>[оверквотинг удален]
>потомков, последнему который с ним связался, а все остальные ничего не
>получают.
>Через пайпы то же самое.
>Через именованный канал тоже только один но случайный потомок получает сообщение.
>Через файл что-то получилось, но есть пара минусов: обмен происходит через хранящийся
>на диске файл, а не через память, и второе: потомки при
>считывании конца файла не ждут записи в него как если использовать
>пайп, приходится в цикле многократно считывать из файла пока в него
>не будет записано, а как сделать ожидание я не знаю.
>Подскажите может есть другие идеи как организовать обмен?Так как ты создаешь потоки, то есть всего 4 типа взаимодействия между потоками:
сокет
канал
файл
память
У каждой системы есть свои плюсы и минусы. выбирай и пользуйся.
>всего 4 типа взаимодействия между
>потоками:
> сокетНе знаю как отправить сообщение сразу всем потокам, подскажите?
> канал
То же самое
> файл
Не знаю как сделать ожидание записи в файл, подскажите?
> память
нет принципа конвейера как в остальных типах, простая программа не получится, мудрить сложное не хочу. Или есть простые варианты для моего случая?
>[оверквотинг удален]
>
>Не знаю как отправить сообщение сразу всем потокам, подскажите?
>
>> канал
>
>То же самое
>
>> файл
>
>Не знаю как сделать ожидание записи в файл, подскажите?не нужно ничего ожидать. потомок запишет что-то в файл, и пошлет родителю (или сразу всем соседним потомкам) сигнал. по приходу сигнала они считают содержимое файла.
http://perl.find-info.ru/perl/015/process/3.htm
http://www.gelin.ru/text/trans/perl-ipc/
>не нужно ничего ожидать. потомок запишет что-то в файл, и пошлет родителю
>(или сразу всем соседним потомкам) сигнал. по приходу сигнала они считают
>содержимое файла.
>
>http://perl.find-info.ru/perl/015/process/3.htm
>http://www.gelin.ru/text/trans/perl-ipc/Эти статиьи я уже читал, идея подходящая, но до конца не разобрался. Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже глаза болят читать, честное слово!
>>не нужно ничего ожидать. потомок запишет что-то в файл, и пошлет родителю
>>(или сразу всем соседним потомкам) сигнал. по приходу сигнала они считают
>>содержимое файла.
>>
>>http://perl.find-info.ru/perl/015/process/3.htm
>>http://www.gelin.ru/text/trans/perl-ipc/
>
>Эти статиьи я уже читал, идея подходящая, но до конца не разобрался.
>Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже
>глаза болят читать, честное слово!Установить обработчик прерывания ДО форка..
Тогда его получат все потомки :)
>[оверквотинг удален]
>>>
>>>http://perl.find-info.ru/perl/015/process/3.htm
>>>http://www.gelin.ru/text/trans/perl-ipc/
>>
>>Эти статиьи я уже читал, идея подходящая, но до конца не разобрался.
>>Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже
>>глаза болят читать, честное слово!
>
>Установить обработчик прерывания ДО форка..
>Тогда его получат все потомки :)Странно! У меня обработчик стоит в самом начале программы, он срабатывает только один раз с PID родителя, хотя есть потомки...
>Установить обработчик прерывания ДО форка..
>Тогда его получат все потомки :)Разобрался. Не важно где стоит обработчик, до или после форка. Сигнал нужно было посылать группе процессов, и включить эти процессы в группу. Вот так работают сигналы:
#!/usr/bin/perl -w
use CGI::Carp qw(fatalsToBrowser);
use strict;
$|=1;
print "Content-type: text/html\n\n";$SIG{USR1} = sub { print "$$: Сигнал получен
";};setpgrp;
my $pppp=$$;defined (my $pid = fork()) or die "$$: Кончились форки. $!
";
if ($pid == 0) {
#Дочь
print "$$ New, СИГНАЛ ! ! ! !
";
kill -30, $pppp;
sleep 2;
print "$$ exit
";
exit;
}
#Мать
sleep 3;
print "$$ exit
";
exit;В результате программа печатает такое:
99829 New, СИГНАЛ ! ! ! !
99829: Сигнал получен
99827: Сигнал получен
99827 exit
99829 exit