使用Perl在2个进程之间进行IPC通信

时间:2015-11-27 13:45:56

标签: perl ipc

我们说我们有一个孩子'和父母'流程定义和子程序

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
}  

如果是,您能指出我在哪里寻找解决方案?也许一个简短的例子就足够了。 :)

谢谢。

1 个答案:

答案 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的每个子项继承的 - 但它不是广播。