URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8599
[ Назад ]

Исходное сообщение
"fork, отправка сообщений всем потомкам."

Отправлено D_Pavel , 26-Янв-10 06:33 
родитель порождает несколько потомков, нужно организовать между ними обмен данными такого типа: каждый потомок отправляет родителю сообщение, а родитель это сообщение пересылает всем остальным (или вообще всем) потомкам.
Второй вариант: любой потомок отправляет сообщене всем своим собратьям минуя родителя.

Пробовал делать через сокет, тогда получается что потомки могут отправить родителю данные через сокет, а родитель используя этот сокет отправляет только одному из потомков, последнему который с ним связался, а все остальные ничего не получают.
Через пайпы то же самое.
Через именованный канал тоже только один но случайный потомок получает сообщение.
Через файл что-то получилось, но есть пара минусов: обмен происходит через хранящийся на диске файл, а не через память, и второе: потомки при считывании конца файла не ждут записи в него как если использовать пайп, приходится в цикле многократно считывать из файла пока в него не будет записано, а как сделать ожидание я не знаю.
Подскажите может есть другие идеи как организовать обмен?


Содержание

Сообщения в этом обсуждении
"fork, отправка сообщений всем потомкам."
Отправлено f00l , 26-Янв-10 07:32 
>[оверквотинг удален]
>потомков, последнему который с ним связался, а все остальные ничего не
>получают.
>Через пайпы то же самое.
>Через именованный канал тоже только один но случайный потомок получает сообщение.
>Через файл что-то получилось, но есть пара минусов: обмен происходит через хранящийся
>на диске файл, а не через память, и второе: потомки при
>считывании конца файла не ждут записи в него как если использовать
>пайп, приходится в цикле многократно считывать из файла пока в него
>не будет записано, а как сделать ожидание я не знаю.
>Подскажите может есть другие идеи как организовать обмен?

Так как ты создаешь потоки, то есть всего 4 типа взаимодействия между потоками:
   сокет
   канал
   файл
   память
  У каждой системы есть свои плюсы и минусы. выбирай и пользуйся.


"fork, отправка сообщений всем потомкам."
Отправлено D_Pavel , 26-Янв-10 07:42 
>всего 4 типа взаимодействия между
>потоками:
>   сокет

Не знаю как отправить сообщение сразу всем потокам, подскажите?

>   канал

То же самое

>   файл

Не знаю как сделать ожидание записи в файл, подскажите?

>   память

нет принципа конвейера как в остальных типах, простая программа не получится, мудрить сложное не хочу. Или есть простые варианты для моего случая?


"fork, отправка сообщений всем потомкам."
Отправлено Square , 26-Янв-10 09:52 
>[оверквотинг удален]
>
>Не знаю как отправить сообщение сразу всем потокам, подскажите?
>
>>   канал
>
>То же самое
>
>>   файл
>
>Не знаю как сделать ожидание записи в файл, подскажите?

не нужно ничего ожидать. потомок запишет что-то в файл, и пошлет родителю (или сразу всем соседним потомкам) сигнал. по приходу сигнала они считают содержимое файла.

http://perl.find-info.ru/perl/015/process/3.htm
http://www.gelin.ru/text/trans/perl-ipc/


"fork, отправка сообщений всем потомкам."
Отправлено D_Pavel , 26-Янв-10 11:35 
>не нужно ничего ожидать. потомок запишет что-то в файл, и пошлет родителю
>(или сразу всем соседним потомкам) сигнал. по приходу сигнала они считают
>содержимое файла.
>
>http://perl.find-info.ru/perl/015/process/3.htm
>http://www.gelin.ru/text/trans/perl-ipc/

Эти статиьи я уже читал, идея подходящая, но до конца не разобрался. Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже глаза болят читать, честное слово!


"fork, отправка сообщений всем потомкам."
Отправлено Square , 26-Янв-10 13:19 
>>не нужно ничего ожидать. потомок запишет что-то в файл, и пошлет родителю
>>(или сразу всем соседним потомкам) сигнал. по приходу сигнала они считают
>>содержимое файла.
>>
>>http://perl.find-info.ru/perl/015/process/3.htm
>>http://www.gelin.ru/text/trans/perl-ipc/
>
>Эти статиьи я уже читал, идея подходящая, но до конца не разобрался.
>Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже
>глаза болят читать, честное слово!

Установить обработчик прерывания ДО форка..
Тогда его получат все потомки :)


"fork, отправка сообщений всем потомкам."
Отправлено D_Pavel , 26-Янв-10 14:00 
>[оверквотинг удален]
>>>
>>>http://perl.find-info.ru/perl/015/process/3.htm
>>>http://www.gelin.ru/text/trans/perl-ipc/
>>
>>Эти статиьи я уже читал, идея подходящая, но до конца не разобрался.
>>Облегчите мне жизнь, скажите прямо, как послать сигнал всем потомкам? Уже
>>глаза болят читать, честное слово!
>
>Установить обработчик прерывания ДО форка..
>Тогда его получат все потомки :)

Странно! У меня обработчик стоит в самом начале программы, он срабатывает только один раз с PID родителя, хотя есть потомки...


"fork, отправка сообщений всем потомкам."
Отправлено D_Pavel , 27-Янв-10 07:27 
>Установить обработчик прерывания ДО форка..
>Тогда его получат все потомки :)

Разобрался. Не важно где стоит обработчик, до или после форка. Сигнал нужно было посылать группе процессов, и включить эти процессы в группу. Вот так работают сигналы:

#!/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