在Perl中的exec之后将数据从子节点传递给父节点

5 perl ipc

我想child.pl在另一个perl程序中调用perl程序parent.pl,并希望将数据传递child.plparent.pl并打印这些数据parent.pl. system("perl child.pl")可能不起作用,因为parent.pl在child.pl完成之前不会做任何事情.我读perlipc的在线文档,似乎pipe()fork()能匹配我的一些需求,但我没能找到一个方法后,从子进程的数据传递给家长exec.这是代码parent.pl:

#!/usr/bin/perl -w

pipe(FROM_CHILD, TO_PARENT);  

$pid = fork();  

if ($pid == 0) {  
    # We're in the child process.  
    close(FROM_CHILD);  
    # Send data to parent.  
    print TO_PARENT "Hello, parent\n"; #  I can pass data to parent before exec
    exec("perl child.pl");             #  But how what should I do after exec, in child.pl?
    exit(0);  # Terminate child.  
} 
elsif (undef $pid) {  
    print "Not defined: means an error.";  
} 
else {  
    # Parent process.  
    close(TO_PARENT);  
    $data = <FROM_CHILD>;  
    print "From child: $data\n";  
    $id = wait();  
    print "Child $id is dead.\n"; 
Run Code Online (Sandbox Code Playgroud)

per*_*eal 7

这可能会有所帮助:

#!/usr/bin/perl
open (my $child, "-|","./child.pl") or die("$!");
while (<$child>) {
  print "P: $_";
}
close($child);
Run Code Online (Sandbox Code Playgroud)

open函数,来自perldoc:

对于三个或更多参数,如果MODE为| - ,则文件名被解释为输出要通过管道输出的命令,如果MODE为 - | ,文件名被解释为管道输出给我们的命令.

如果您不想触摸标准输出,那么您需要孩子的合作,然后您可以使用命名管道:

parent.pl

#!/usr/bin/perl
use strict;
use warnings;
use Fcntl;
use POSIX;
my $fpath = '.named.pipe';

mkfifo($fpath, 0666) or die "mknod $!";
system("perl child.pl &");
sysopen(my $fifo, $fpath, O_RDONLY) or die "sysopen: $!";

while (<$fifo>) {
  print "P: $_";
}
close($fifo);
unlink($fifo);
Run Code Online (Sandbox Code Playgroud)

child.pl

#!/usr/bin/perl
use strict;
use warnings;
use Fcntl;
use POSIX;

my $fpath = '.named.pipe';
sysopen(my $fifo, $fpath, O_WRONLY) or die "sysopen: $!";
print "screen hello\n";
print $fifo "parent hello\n";
close($fifo);
Run Code Online (Sandbox Code Playgroud)