Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Perl在两个进程之间进行IPC通信_Perl_Ipc - Fatal编程技术网

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

使用Perl在两个进程之间进行IPC通信,perl,ipc,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

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

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
}  
如果是,您能否指出我可以如何或在哪里寻找解决方案?也许一个简短的例子就足够了


谢谢。

文档中有一整页关于进程间通信:

回答你的问题-是的,有一种方法可以做你想做的事。问题是,它到底是什么。。。取决于您的用例。我说不出你想要完成什么——比如你所说的“转为父母”是什么意思

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

#!/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;
}
#/usr/bin/env perl
严格使用;
使用警告;
管道(我的$reader,我的$writer);
我的$pid=fork()#您可能应该测试未定义的fork故障。
如果($pid==0){
##儿童:
关闭($writer);
while(我的$line=){
打印“Child get$line\n”;
}
}
否则{
##在父项中:
关闭($reader);
打印{$writer}“家长打招呼!\n”;
睡眠5;
}
注意:您可能需要检查您的
fork
返回代码-
0
表示我们在子系统中-数字表示我们在父系统中,
undef
表示fork失败

另外:你的管道会缓冲——在某些情况下,这可能会绊倒你。它可以一直运行到最后,但在您认为应该的时候,您可能无法获得IO


您可以用另一种方式打开管道-子命令->父命令。但在使用多fork时要稍微小心,因为活动管道由fork的每个子级继承,但它不是广播

如果要让一个进程一次只执行一个,为什么要有两个进程?