fork, отправка сообщений всем потомкам., D_Pavel, 26-Янв-10, 06:33 [смотреть все]родитель порождает несколько потомков, нужно организовать между ними обмен данными такого типа: каждый потомок отправляет родителю сообщение, а родитель это сообщение пересылает всем остальным (или вообще всем) потомкам. Второй вариант: любой потомок отправляет сообщене всем своим собратьям минуя родителя.Пробовал делать через сокет, тогда получается что потомки могут отправить родителю данные через сокет, а родитель используя этот сокет отправляет только одному из потомков, последнему который с ним связался, а все остальные ничего не получают. Через пайпы то же самое. Через именованный канал тоже только один но случайный потомок получает сообщение. Через файл что-то получилось, но есть пара минусов: обмен происходит через хранящийся на диске файл, а не через память, и второе: потомки при считывании конца файла не ждут записи в него как если использовать пайп, приходится в цикле многократно считывать из файла пока в него не будет записано, а как сделать ожидание я не знаю. Подскажите может есть другие идеи как организовать обмен?
|
- fork, отправка сообщений всем потомкам., f00l, 07:32 , 26-Янв-10 (1)
>[оверквотинг удален] >потомков, последнему который с ним связался, а все остальные ничего не >получают. >Через пайпы то же самое. >Через именованный канал тоже только один но случайный потомок получает сообщение. >Через файл что-то получилось, но есть пара минусов: обмен происходит через хранящийся >на диске файл, а не через память, и второе: потомки при >считывании конца файла не ждут записи в него как если использовать >пайп, приходится в цикле многократно считывать из файла пока в него >не будет записано, а как сделать ожидание я не знаю. >Подскажите может есть другие идеи как организовать обмен? Так как ты создаешь потоки, то есть всего 4 типа взаимодействия между потоками: сокет канал файл память У каждой системы есть свои плюсы и минусы. выбирай и пользуйся.
- fork, отправка сообщений всем потомкам., D_Pavel, 07:42 , 26-Янв-10 (2)
>всего 4 типа взаимодействия между >потоками: > сокетНе знаю как отправить сообщение сразу всем потокам, подскажите? > канал То же самое > файл Не знаю как сделать ожидание записи в файл, подскажите? > память нет принципа конвейера как в остальных типах, простая программа не получится, мудрить сложное не хочу. Или есть простые варианты для моего случая?
- fork, отправка сообщений всем потомкам., Square, 09:52 , 26-Янв-10 (3)
- fork, отправка сообщений всем потомкам., D_Pavel, 11:35 , 26-Янв-10 (4)
>не нужно ничего ожидать. потомок запишет что-то в файл, и пошлет родителю >(или сразу всем соседним потомкам) сигнал. по приходу сигнала они считают >содержимое файла. > >http://perl.find-info.ru/perl/015/process/3.htm >http://www.gelin.ru/text/trans/perl-ipc/ Эти статиьи я уже читал, идея подходящая, но до конца не разобрался. Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже глаза болят читать, честное слово!
- fork, отправка сообщений всем потомкам., Square, 13:19 , 26-Янв-10 (5)
>>не нужно ничего ожидать. потомок запишет что-то в файл, и пошлет родителю >>(или сразу всем соседним потомкам) сигнал. по приходу сигнала они считают >>содержимое файла. >> >>http://perl.find-info.ru/perl/015/process/3.htm >>http://www.gelin.ru/text/trans/perl-ipc/ > >Эти статиьи я уже читал, идея подходящая, но до конца не разобрался. >Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже >глаза болят читать, честное слово! Установить обработчик прерывания ДО форка.. Тогда его получат все потомки :)
- fork, отправка сообщений всем потомкам., D_Pavel, 14:00 , 26-Янв-10 (6)
>[оверквотинг удален] >>> >>>http://perl.find-info.ru/perl/015/process/3.htm >>>http://www.gelin.ru/text/trans/perl-ipc/ >> >>Эти статиьи я уже читал, идея подходящая, но до конца не разобрался. >>Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже >>глаза болят читать, честное слово! > >Установить обработчик прерывания ДО форка.. >Тогда его получат все потомки :) Странно! У меня обработчик стоит в самом начале программы, он срабатывает только один раз с PID родителя, хотя есть потомки...
- fork, отправка сообщений всем потомкам., D_Pavel, 07:27 , 27-Янв-10 (7)
>Установить обработчик прерывания ДО форка.. >Тогда его получат все потомки :) Разобрался. Не важно где стоит обработчик, до или после форка. Сигнал нужно было посылать группе процессов, и включить эти процессы в группу. Вот так работают сигналы: #!/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
|