这个打印1..10两次:
seq 10 > /tmp/ten
perl -e 'fork();seek(STDIN,0,0); print <STDIN>' </tmp/ten
Run Code Online (Sandbox Code Playgroud)
我想使用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
Run Code Online (Sandbox Code Playgroud)
首先,继承句柄的正确表示法是:
open3("<&STDIN", ">&STDOUT", ">&STDERR", "cat")
Run Code Online (Sandbox Code Playgroud)
但是打印1..10两次?你不应该依赖于那种情况!只有时机恰到好处才会发生.事实上,即使对于原始程序,它也很少发生在我身上.问题源于父进程和子进程共享相同的文件指针.
也许为了避免让人们依赖这种非常不可靠的行为,open3当它创建了一个副本时关闭第一个句柄.有可能欺骗它如下:
open(local *CHILD_STDIN, "<&", \*STDIN) or die $!;
open3("<&CHILD_STDIN", ">&STDOUT", ">&STDERR", "cat")
Run Code Online (Sandbox Code Playgroud)
这样,open3将关闭dup CHILD_STDIN,但不关闭STDIN本身.通过此更改,您将在幸运时将列表打印两次.
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |