RJ *_*ite 10 perl redirect stdout pipe exec
我试图让一个exec的子进程的STDOUT/STDERR通过Perl中的管道返回到父进程.我所看到的最接近我想做的是: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) ;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
Slaven Rezic 对为什么您的代码不起作用有正确的答案,但您还应该知道可以使用的快捷方式。特殊的 pipe+forkopen READER, '-|'为您完成几乎所有的设置工作,创建一个子进程,将其STDOUT写入父进程可以读取的管道中READER。这只是让STDERR您手动执行重定向。
代码的缩短版本如下所示:
my $child = open READER, '-|';
defined $child or die "pipe/fork: $!\n";
if ( $child ) {
print "I am the parent: My pid = $$ junior = $child\n" ;
my @output = <READER> ;
print @output ;
print "parent is DONE\n" ;
} else {
print "I am the child. My pid = $$\n" ;
open STDERR, '>&STDOUT';
print "XXX ouput before exec....\n" ;
exec( $cmd ) or exit(1) ;
}
Run Code Online (Sandbox Code Playgroud)
仅使用赋值重定向文件描述符是不可能的.相反,需要使用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) ;
Run Code Online (Sandbox Code Playgroud)