0

我知道我可以做到以下几点:

open(STDOUT, "|-", "cmd");

这大概会导致以下结果:

  1. fork();
  2. exec("cmd");
  3. 将原始进程的 STDOUT 链接到新进程的 STDIN。

我想做的是上面的第 2 步,即不要执行exec(). 只需让当前进程的两个副本继续,子进程的 STDIN 链接到父进程的 STDOUT。

这将允许我继续这样:

if (! $pid)
{
  # Handle data in child here
  open OUTFILE1 $file1;
  open OUTFILE2 $file2;
  my $i = 0;
  while (<>)
  {
    print (i % 2 ? OUTFILE1 : OUTFILE2) "Line $i: $_";
    ++$i;
  }
  exit;
}
else
{
  # Continue parent here
  print STDOUT "Hello World from print()";
  system("echo Hello World from system()");
}

上面的代码应该在输出中添加一个行号,并将这些数据逐行写入不同的文件(我知道这有点傻,但这只是一个例子)。

有没有办法或图书馆做到这一点?我考虑perltie过,但它似乎没有处理来自 的结果system(),因此我相信我需要一个单独的进程来实际将 STDOUT 传输到。

4

1 回答 1

3

IIRC,你只是想要

open(STDOUT, "|-", "-");

open3也只需要一行,具有更好的错误报告,并且还允许您捕获 STDERR。

use IPC::Open3 qw( open3 );
use POSIX      qw( _exit );

sub child {
   print("Hello World from print()\n");
   system("echo", "Hello World from system()");
}

my $pid = open3(
   '<&STDIN',
   \local *CHILD_STDOUT,
   '>&STDERR',
   '-',
);

if (!$pid) {
   if (eval { child(); 1 }) {
      _exit(0);
   } else {
      print(STDERR $@);
      _exit($! || ($? >> 8) || 255);
   }
}

while (<CHILD_STDOUT>) {
   ...
}

waitpid($pid, 0);
于 2013-02-15T07:53:28.323 回答