Возможно ли в Perl установить канал таким образом, чтобы у родителя был только один канал READER, и многие дети записывали в него, когда они оживают / выходят?
Типичный код поваренной книги:
#!/usr/bin/perl -w
# pipe2 - use pipe and fork so child can send to parent
use IO::Handle;
pipe(READER, WRITER);
WRITER->autoflush(1);
if ($pid = fork) {
close WRITER;
chomp($line = <READER>);
print "Parent Pid $$ just read this: `$line'\n";
// do what you need
} else {
die "cannot fork: $!" unless defined $pid;
close READER;
print WRITER "Child Pid $$ is sending this\n";
close WRITER; # this will happen anyway
exit;
}
Давайте вместо этого предположим случай, когда мне нужно, чтобы мой родительский «ЧИТАТЕЛЬ» получал сообщения от нескольких дочерних элементов, возможно ли это сделать без сохранения списка каналов, по одному на каждый дочерний элемент?Я не могу закрыть WRITER в родительском элементе, потому что следующий дочерний элемент не получит действительный дескриптор для записи.Мне также нужно, чтобы родитель продолжал свою обычную работу и не блокировал какие-либо данные клиента из канала.
Псевдокод того, что мне нужно:
# parent code
pipe (READER, WRITER)
fork_random_number_of_children(READER,WRITER)
on_some_tick => {
my $data = read_from(READER, non_blocking)
if (data) print "Hey some child sent me: $data"
else print "No data, going back life"
do_other_things_before_next_tick()
}
child_job(R,W) { # lets assume this is called for each child fork
close (R); # no problem, its a copy
sleep (random duration)
print W, "Message from child with pid $$"
exit 0
}