6

我想child.pl在另一个 perl 程序中调用一个 perl 程序parent.pl,并希望从 to 传递数据child.plparent.pl打印这些数据parent.plsystem("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"; 
4

1 回答 1

7

这可能会有所帮助:

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

打开函数,来自 perldoc

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

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

父.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);

孩子.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);
于 2013-03-13T06:47:37.687 回答