Perl: let open3 inherit STDIN, STDOUT, STDERR



此打印1..10两次:

seq 10 > /tmp/ten
perl -e 'fork();seek(STDIN,0,0); print <STDIN>' </tmp/ten

我想使用ipc :: open3做同样的事情,但是我无法正常工作:

perl -MIPC::Open3 -e 'fork();seek(STDIN,0,0); open3(0,1,2,"cat");' < /tmp/ten
perl -MIPC::Open3 -e 'fork();seek(STDIN,0,0); open3(STDIN,STDOUT,STDERR,"cat");' < /tmp/ten
perl -MIPC::Open3 -e 'fork();seek(STDIN,0,0); open3(*STDIN,*STDOUT,*STDERR,"cat");' < /tmp/ten
perl -MIPC::Open3 -e 'fork();seek(STDIN,0,0); open3(*STDIN,*STDOUT,*STDERR,"cat");' < /tmp/ten

首先,继承手柄的适当符号是:

open3("<&STDIN", ">&STDOUT", ">&STDERR", "cat")

但是打印1..10两次?您不应该依靠这一发生!它只有在时间恰到好处的情况下才会发生。实际上,即使对于您的原始程序,这也很少发生。问题源于父母和子处理共享相同文件指针的事实。

也许是为了避免让人们依靠这种极其不可靠的行为,open3在创建的DUP时关闭了第一个手柄。可以按照以下方式愚弄它:

open(local *CHILD_STDIN, "<&", *STDIN) or die $!;
open3("<&CHILD_STDIN", ">&STDOUT", ">&STDERR", "cat")

这样,open3将关闭DUP CHILD_STDIN,但不能关闭STDIN本身。通过此更改,您可以在幸运的时候获得两次列表。

相关内容

  • 没有找到相关文章

最新更新