簡體   English   中英

為分叉過程重新分配STDOUT

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM