首页 文章

Perl:open3但是对于n个文件描述符

提问于
浏览
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没办法给我这个 .

是否有一个openN或IPC :: Run :: run的方式给我PID?

Background

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

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

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

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
    

相关问题