假设我们有一个“子”和“父”进程定义和子例程
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
} 如果是,你能指出怎么做,或者在哪里能找到解决方案?也许一个简短的例子就足够了。:)
谢谢。
发布于 2015-11-27 14:10:59
文档中有一个关于进程间通信的完整页面: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表示我们在子中--一个数字表示我们在父中,undef表示叉子失败。
此外:您的管道将缓冲-这可能会绊倒您在某些情况下。它会一直运行到最后,但是当你认为你应该得到IO的时候,你可能不会得到IO。
您可以用相反的方式打开管道-用于子->父通信。但是,当您使用多叉时要稍微小心,因为一个活动管道是由叉的每个子节点继承的,但它不是广播。
https://stackoverflow.com/questions/33958763
复制相似问题