&STDERR", "cat")-6ren">
gpt4 book ai didi

Perl:让open3继承STDIN、STDOUT、STDERR

转载 作者:行者123 更新时间:2023-12-01 11:21:22 24 4
gpt4 key购买 nike

打印 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 在第一个句柄是它创建的副本时关闭它。可以这样愚弄它:

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

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

关于Perl:让open3继承STDIN、STDOUT、STDERR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42428182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com