2

open3 只接受 STDIN、STDOUT 和 STDERR。如果正在运行的命令使用其他文件描述符,则 open3 无法捕获这些:

echo foo # Can be captured
echo foo >&2 # Can be catured
echo foo >&3 # Cannot be captured (with open3)

我研究了 IPC::Run::run 似乎能够处理这个问题,但我也需要 PID,但我发现 IPC::Run::run 没有办法给我。

IPC::Run::run 是否有 openN 或方法来给我 PID?

背景

这是为了 GNU Parallel 的一个可能的扩展,所以你可以这样做:

parallel 'echo {} start >&3;sleep 10;echo {} end >&3' ::: a b c 3>out.file

没有混合不同工作的输出。GNU Parallel 需要跟踪每个 pid - 尤其是在--keep-order使用时。

4

1 回答 1

0

fd3 已经存在,所以你需要做的就是确保孩子继承它。由于它本身是继承的,因此您根本不需要做任何事情。

$ perl -e'
   system "echo foo >&3";
' 3>bar

$ cat bar
foo

但是如果你想确保它是继承的,你可以使用以下

$ perl -e'
   use Fcntl qw( F_GETFD F_SETFD FD_CLOEXEC );
   if (open(my $fh, ">&=", 3)) {
      my $flags = fcntl($fh, F_GETFD, 0)
         or die $!;
      fcntl($fh, F_SETFD, $flags & ~FD_CLOEXEC)
         or die $!;
   }

   system "echo foo >&3";
' 3>bar

$ cat bar
foo
于 2013-07-16T14:45:27.770 回答