首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个进程与Perl之间的IPC通信

两个进程与Perl之间的IPC通信
EN

Stack Overflow用户
提问于 2015-11-27 13:45:56
回答 1查看 1.5K关注 0票数 1

假设我们有一个“子”和“父”进程定义和子例程

代码语言:javascript
复制
my $pid = fork;
die "fork failed: $!" unless defined($pid);

local $SIG{USR1} = sub {
kill KILL => $pid;
$SIG{USR1} = 'IGNORE';
kill USR1 => $$;
};

我们把它们分开,能做以下的事情吗?

代码语言:javascript
复制
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
}  

如果是,你能指出怎么做,或者在哪里能找到解决方案?也许一个简短的例子就足够了。:)

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-11-27 14:10:59

文档中有一个关于进程间通信的完整页面:perlipc

回答你的问题-是的,有一种方法可以做你想做的事。问题是,到底是什么.取决于你的用例。我不知道你想做什么--比如,你所说的“转到父母”是什么意思?

但通常(我认为)最简单的方法是使用管道:

代码语言:javascript
复制
#!/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。

您可以用相反的方式打开管道-用于子->父通信。但是,当您使用多叉时要稍微小心,因为一个活动管道是由叉的每个子节点继承的,但它不是广播。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33958763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档