我试图让执行子进程中的 STDOUT/STDERR 通过 Perl 中的管道返回到父进程。我见过的最接近我想做的事情是:http://forums.devshed.com/perl-programming-6/exec-and-redirecting-stdout-stderr-168501.html http://forums.devshed.com/perl-programming-6/exec-and-redirecting-stdout-stderr-168501.html
以下是我正在尝试做的事情的精简示例。我还尝试了上面链接的变体。我看不出我做错了什么......
#!/usr/bin/env perl
use strict ;
use warnings ;
my $cmd = "/usr/bin/who -a" ; # anything to stdout
pipe( READER, WRITER ) ;
my $child = fork() ;
if ( $child ) {
print "I am the parent: My pid = $$ junior = $child\n" ;
close( WRITER ) ;
my @output = <READER> ;
print @output ;
print "parent is DONE\n" ;
} else {
print "I am the child. My pid = $$\n" ;
close( READER ) ;
close( STDOUT );
close( STDERR );
*STDOUT = *WRITER ;
*STDERR = *WRITER ;
print WRITER "XXX ouput before exec....\n" ;
exec( $cmd ) or exit(1) ;
}
仅通过赋值来重定向文件描述符是不可能的。相反,需要使用open
就像描述的那样perldoc -f open
。在您的情况下,子代码将如下所示:
print "I am the child. My pid = $$\n" ;
close( READER ) ;
open STDOUT, ">&", \*WRITER or die $!;
open STDERR, ">&", \*WRITER or die $!;
print WRITER "XXX ouput before exec....\n" ;
exec( $cmd ) or exit(1) ;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)