我们说我们有一个孩子'和父母'流程定义和子程序
my $pid = fork;
die "fork failed: $!" unless defined($pid);
local $SIG{USR1} = sub {
kill KILL => $pid;
$SIG{USR1} = 'IGNORE';
kill USR1 => $$;
};
我们将它们分开,是否可以执行以下操作?
if($pid == 0){
sub1();
#switch to Parent process to execute sub4()
sub2();
#switch to Parent process to execute sub5()
sub3();
}
else
{
sub4();
#send message to child process so it executes sub2
sub5();
#send message to child process so it executes sub3
}
如果是,您能指出我在哪里寻找解决方案?也许一个简短的例子就足够了。 :)
谢谢。
答案 0 :(得分:1)
关于进程间通信的文档中有一整页:perlipc
回答你的问题 - 是的,有办法做你想做的事。问题是,它究竟是什么......取决于你的用例。我不能告诉你你想要完成什么 - 你的意思是什么,切换到父母'例如?
但通常最简单的(在我看来)是使用管道:
#!/usr/bin/env perl
use strict;
use warnings;
pipe ( my $reader, my $writer );
my $pid = fork(); #you should probably test for undef for fork failure.
if ( $pid == 0 ) {
## in child:
close ( $writer );
while ( my $line = <$reader> ) {
print "Child got $line\n";
}
}
else {
##in parent:
close ( $reader );
print {$writer} "Parent says hello!\n";
sleep 5;
}
注意:您可能需要查看fork
返回代码 - 0
表示我们在孩子身上 - 数字意味着我们在父母身上,{{1这意味着fork失败了。
另外:你的烟斗会缓冲 - 在某些情况下,这可能会让你失望。它会跑到最后很好,但是当你认为应该时,你可能不会得到IO。
您可以反过来打开管道 - 对于child-&gt;父通信。但是,当你使用多叉时要小心谨慎,因为活动管道是由 fork的每个子项继承的 - 但它不是广播。