首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么编程Perl的"7.2.39 IPC::Open2“中显示的程序实际上结束了?

为什么编程Perl的"7.2.39 IPC::Open2“中显示的程序实际上结束了?
EN

Stack Overflow用户
提问于 2020-08-04 05:57:08
回答 1查看 93关注 0票数 3

我所指的程序是在本节这里中显示的第二个程序。它的一个小改动是:

代码语言:javascript
复制
#!/usr/bin/perl -w
use IPC::Open2;
use Symbol;

$WTR = gensym();  # get a reference to a typeglob
$RDR = gensym();  # and another one

$pid = open2($RDR, $WTR, 'bc');
print "$pid\n";

while (<STDIN>) {           # read commands from user
    print $WTR $_;          # write a command to bc(1)
    $line = <$RDR>;         # read the output of bc(1)
    print STDOUT "$line";   # send the output to the user
}

这个程序运行正常。如果它的名称是prop_7_2_39_2.pl,那么与它的典型交互是:

代码语言:javascript
复制
>./prop_7_2_39_2.pl
75955
2+2
4
quit

>

也就是说,在输入“退出”之后,子进程bc就失效了,之后我需要输入一个换行符才能真正完成perl父进程。为什么<STDIN>被评估为false?我理解perl计算<STDIN>的定义。一些相关的程序

代码语言:javascript
复制
#!/usr/bin/perl -w
while(<STDIN>){}

并没有结束。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-04 07:01:07

在将quit发送到bc之后,它将终止,从而关闭管道的读取端。然后,您的下一个print $WTR $_将失败并生成终止程序的SIGPIPE信号--除非您为它安装了信号处理程序。

另一种解决方案可能是在您向bc发送了一些信息之后检查它的读取结果:

代码语言:javascript
复制
while (<STDIN>) {              # read commands from user
    print $WTR $_;             # write a command to bc(1)
    my $line = <$RDR>;         # read the output of bc(1)

    if($line) {
        print STDOUT "$line";  # send the output to the user
    } else {
        last;                  # break out of the while loop
    }
}
print "Controlled ending...\n";
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63240983

复制
相关文章

相似问题

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