【发布时间】:2018-10-09 14:31:12
【问题描述】:
是否有可能在 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
}
【问题讨论】:
-
一个简单的服务器可以很好地服务吗? (特别是那些回调。)在我看来,这位慢跑的教皇可能正在推动它。
标签: perl