The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"fork, отправка сообщений всем потомкам."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

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

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

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "fork, отправка сообщений всем потомкам."  +/
Сообщение от D_Pavel (ok) on 26-Янв-10, 07:42 
>всего 4 типа взаимодействия между
>потоками:
>   сокет

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

>   канал

То же самое

>   файл

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

>   память

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "fork, отправка сообщений всем потомкам."  +/
Сообщение от D_Pavel (ok) on 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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру