首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl:让open3继承标准输入、标准输入、标准错误

Perl:让open3继承标准输入、标准输入、标准错误
EN

Stack Overflow用户
提问于 2017-02-24 07:34:53
回答 1查看 371关注 0票数 3

这个print 1..10两次:

代码语言:javascript
复制
seq 10 > /tmp/ten
perl -e 'fork();seek(STDIN,0,0); print <STDIN>' </tmp/ten

我也想使用IPC::Open3来做同样的事情,但是我不能让它工作:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-02-24 08:02:07

首先,继承句柄的正确表示法是:

代码语言:javascript
复制
open3("<&STDIN", ">&STDOUT", ">&STDERR", "cat")

但是打印1..10两次?你不应该相信这会发生!只有在时机恰到好处的情况下,这才会发生。事实上,这很少发生在我身上,即使是你的原始程序也是如此。问题源于父进程和子进程共享相同的文件指针。

也许为了避免人们依赖这种极其不可靠的行为,open3在它创建的dup时关闭了第一个句柄。可以像下面这样愚弄它:

代码语言:javascript
复制
open(local *CHILD_STDIN, "<&", \*STDIN) or die $!;
open3("<&CHILD_STDIN", ">&STDOUT", ">&STDERR", "cat")

这样,open3将关闭dup CHILD_STDIN,但不会关闭STDIN本身。使用此更改,您将在幸运的时候打印两次列表。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42428182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档