[英]Reassigning STDOUT for a forked process
我正在尝试将派生进程的STDOUT
分配给管道。 例如
use warnings;
use strict;
use feature qw(say);
use IO::Select;
my $cmd='sleep 2; echo Hello';
pipe(PREAD, PWRITE);
my $pid=fork();
if ($pid==0) {
*STDOUT=*PWRITE;
exec $cmd;
die "Could not run command \"$cmd\"";
}
my $sel = IO::Select->new( \*PREAD );
say "Waiting for background process..";
while (1) {
my @ready = $sel->can_read;
last if (! @ready);
for my $fh (@ready) {
say "Processing file descriptor ".($fh->fileno());
my $line=<$fh>;
if (! defined $line) {
say "EOF";
$sel->remove($fh);
next;
}
chomp($line);
say "Got line: \"$line\"..";
}
}
waitpid ($pid,0);
say "Done.";
但是管道PREAD
什么也没有出现; 子级仍然输出到STDOUT
而不是管道。
* STDOUT = * PWRITE;
这只会将perl文件句柄PWRITE分配给perl文件句柄STDOUT,而不会更改操作系统的基础文件描述符。 为此,您需要将基础文件描述符从PWRITE复制到fd 1(STDOUT):
打开(STDOUT, “>&PWRITE”);
完成此操作后,将复制PWRITE,现在可以将其作为PWRITE和STDOUT进行访问。 一个好的样式是先close(PWRITE)
然后使STDOUT成为唯一写入管道的文件句柄。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.