此打印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本身。通过此更改,您可以在幸运的时候获得两次列表。