我想child.pl在另一个perl程序中调用perl程序parent.pl,并希望将数据传递child.pl给parent.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)
这可能会有所帮助:
#!/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)