这个print 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发布于 2017-02-24 08:02:07
首先,继承句柄的正确表示法是:
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本身。使用此更改,您将在幸运的时候打印两次列表。
https://stackoverflow.com/questions/42428182
复制相似问题