Родитель слушает своих детей

Все о программировании под *nix
Lioxa
Неотъемлемая часть форума
Сообщения: 732
Зарегистрирован: 18 янв 2004, 22:29
Откуда: Минск
Контактная информация:

Родитель слушает своих детей

Сообщение Lioxa »

Есть задача

Родительский процесс создаёт несколько потомков. Потомкам отдаёт начальные данные. и По мере завершения обработки в потомках, родитель обрабатывает их результаты. Для этого я хочу перенаправить потоки вывода потомков на поток ввода родителя. по аналогии с
program 2>&1

Но пока не получается. Делаю на Perl. Если есть идеи, буду благодарен. Если идеи на C или Shell - тоже хорошо, да и на других я зыках пойдёт - по аналогии найду как это сделать в перле.

На данный моомент подсказали сделать stdin сокетом, и потомки смогут туда слать информацию. всё хорошо, да вот с портами может быть напряг, поэтому хочу есчо подумать как это сделать без сокетов.

Hermit
Неотъемлемая часть форума
Сообщения: 354
Зарегистрирован: 22 сен 2004, 13:47
Откуда: Minsk
Контактная информация:

Сообщение Hermit »

Можно сделать с помощью pipes.
А вообще рекомендую погуглить на тему linux IPC.

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Lioxa, а документацию почитать? man/perldoc perlipc в части socketpair например ;)
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
exe
Неотъемлемая часть форума
Сообщения: 860
Зарегистрирован: 28 ноя 2003, 21:08
Откуда: Минск

Сообщение exe »

C - самое простое popen
Korn shell - Coprocess

Lioxa
Неотъемлемая часть форума
Сообщения: 732
Зарегистрирован: 18 янв 2004, 22:29
Откуда: Минск
Контактная информация:

Сообщение Lioxa »

Hermit, Llama, не делайте поспешных выводов :)
Я perlipc уже 3 дня вычитываю, в поисках того что мне подойдёт. Я даже написал, что есть решение через сокеты. ;)
Проблема не в том что бы наладить свзяь между родителем и потомком. А в том чтобы STDOUT'ы всех потомков направить на STDIN родителя.

Аватара пользователя
cympak
Увлекающийся
Сообщения: 114
Зарегистрирован: 26 окт 2005, 13:38

Сообщение cympak »

#!/usr/bin/perl -w
use IO::Handle; # autoflush
pipe(CHILD_RDR, PARENT_WTR);
PARENT_WTR->autoflush(1);

if ($pid = fork) {
close PARENT_WTR;
chomp($line = <CHILD_RDR>);
print "Parent Pid $$ just read this: `$line'\n";
close CHILD_RDR;
waitpid($pid,0);
} else {
close CHILD_RDR;
print PARENT_WTR "Child Pid $$ is sending this\n";
close PARENT_WTR;
exit;
}

что-то вроде этого, либо через сокеты.
http://perldoc.perl.org/perlipc.html#Bi ... er-Process

Аватара пользователя
grub
Неотъемлемая часть форума
Сообщения: 849
Зарегистрирован: 13 сен 2006, 10:29
Откуда: Минск
Контактная информация:

Сообщение grub »

У него многодетный процесс... может не страдать X-ней, и покопать в сторону named pipes на файловой системе?

Команда mkfifo если память не изменяет -- и дальше работа, как с файлом...

Только еще надо будет как-то ждать известий о смерти от детишек... чтобы все это не завесилось...
Змагайся і адпачывай!

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Lioxa, на так почитай еще perldoc perlfunc и переоткрой STDOUT в детках. С STDIN насколько я понимаю, так не получится. Реализовать конструкцию вида "несколько процессов куда-то пишут, а один процесс читает из _одного_ файлового дескриптора пайпами и парами сокетов не получится. Действительно ли надо, чтобы данные от разных процессов приходили в перемешку? Конструкцию вида "многие-к-одному" можно реализовать с помощью более других функций IPC - например - очереди сообщений, либо, действительно UNIX-сокеты и пробывать переоткрыть STDIN на этот сокет в родителе и на STDOUT в детках...
Можно в паре слов расказать, почему данные от _всех_ деток должны поступать строго в STDIN родителя? ИМХО логичнее было бы иметь пул декрипторов из socketpair и обрабатывать их select'ом в родителе, а в детках - просто переоткрыть на STDOUT?
ИМХО задача ректальная - либо это лаба, либо попытка связать STDOUT нескольких процессов которые запускаются в детках с STDIN процесса который отдельно запускается непосредственно из родителя...
Опыт растет прямо пропорционально выведенному из строя оборудованию

Lioxa
Неотъемлемая часть форума
Сообщения: 732
Зарегистрирован: 18 янв 2004, 22:29
Откуда: Минск
Контактная информация:

Сообщение Lioxa »

данные идут порциями. есть симафор, который говорит, что можно писать, это к тому что данные не бдут перемешаны.
С select'ом не получается. если в момент проверки селектом в потоке 10 байт, то если прочитать только 5 (данные структурированы и читаются порциями), то пока остальные 5 не будут прочитаны, селект говорит что поток пуст. по прочитав одну порцию данных нет возможности проверить есть ли там ещё что-то, иначе если читать поток, то пока в него что-то не придёт процесс будет ждать.

Это задача для реального проекта. при такой архитектуре появляется определённая гибкость в работе. сам родитель является потомком основного механизма и является как бы проксёй для произвольного количесвта потомков, которые выполняют одно и тоже но с разными порциями информации.

Как и говорил в первом посте есть решение с сокетами, по видимому оно и будет использовано...

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Lioxa, ну если вам не нужна смесь данных - то обходите в цикле дескрипторы сокетов и будет вам счастье і не майтесь с семафорами, благо socketpair и без них жить ;)
Опыт растет прямо пропорционально выведенному из строя оборудованию

Lioxa
Неотъемлемая часть форума
Сообщения: 732
Зарегистрирован: 18 янв 2004, 22:29
Откуда: Минск
Контактная информация:

Сообщение Lioxa »

Aleksey Kondratenko, спасибо за разъяснение ситуации с семафорами.

В итоге немного переделал архитектуру, и использую пул дискрипторов и разгребаю их с помощью селекта.

Всем спасибо за советы.

d4s
Маньяк
Сообщения: 184
Зарегистрирован: 11 авг 2003, 12:12
Откуда: Минск
Контактная информация:

Сообщение d4s »

Может и поздновато, но...
а вы смотрели в сторону POSIX Message Queues ? (msgctl(2), msgget(2), msgrcv(2), msgsnd(2))

если у вас в пределах одной машины все - идеально подходит к вашей архитектуре имхо

ЗЫ но select в любом случае хорший выход, да и ограничение на 1 машину снимает
WBR, d4s
linux registered user #264610 [Empty]

Lioxa
Неотъемлемая часть форума
Сообщения: 732
Зарегистрирован: 18 янв 2004, 22:29
Откуда: Минск
Контактная информация:

Сообщение Lioxa »

нет, не смотрел.
Но для следующих проетов может пригодится. изучу более подробно.
Да на одной машине.

Ответить