我有一个小程序,运行到收到SIGINT或收到来自stdin的两行(按Enter键两次)。反应块逻辑为:
react {
whenever signal(SIGINT) {
say "Got signal";
exit;
}
whenever $*IN.lines.Supply {
say "Got line";
exit if $++ == 1 ;
}
}
Run Code Online (Sandbox Code Playgroud)
程序将按预期在两行输入中退出。
但是,CTRL-C不会执行任何操作,除非它后跟一行(输入)。
如果我切换everyever块的顺序,则程序会被SIGINT中断,但无论何时都不会执行信号
react {
whenever $*IN.lines.Supply {
say "Got line";
exit if $++ == 1 ;
}
whenever signal(SIGINT) {
say "Got signal";
exit;
}
}
Run Code Online (Sandbox Code Playgroud)
使用信号接头之前是否还需要其他设置?在反应块中,每当块的顺序重要吗?
更新资料
因此,似乎lines()调用阻止了React块的执行(感谢@Håkon)。我有点明白。
与用于读取套接字的类似代码结构进行比较时,我很困惑。数据的存在(或缺少)对信号处理程序的执行没有影响,并且在此示例中它可以读取行:
my $listener=IO::Socket::Async.listen("0.0.0.0",4432);
react {
whenever $listener {
whenever $_.Supply.lines() {
say "Got line";
}
}
whenever signal(SIGINT) {
say "Got signal";
exit;
}
} …Run Code Online (Sandbox Code Playgroud)