gpt4 book ai didi

ruby - 中断从 ruby 调用的 child

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:45 24 4
gpt4 key购买 nike

为什么使用 system 调用创建的子进程中断 ruby​​ 进程不会中断 ruby​​ 进程本身?他们应该属于同一个组,所以应该都被打断。这也不适用于 ruby​​2.0。

给定 ruby​​ 1.8.7 补丁 371、ruby 1.9.3 补丁 392 和 ruby​​2.0 补丁 0:

运行 ruby1.8 -e 'system "sleep 100"; $?; bash 中的 sleep' 并按 ⌃C 只会终止对 sleep 100 的内部调用。

Ruby 1.9 的行为相同。

虽然运行 ruby2.0 -e 'system "sleep 100"; $?; sleep' 中断内部命令和 ruby​​ 进程本身。2.0.0-p0

--编辑--

阅读资源我发现处理 SIGINTSIGQUITSIGHUPrb_syswait 中切换为忽略等待创建的子进程完成然后恢复处理程序的方法(rb_syswait in ruby v1.8.7-p370ruby v1.9.3-p362 并且不阻塞 ruby v2.0.0-p0 中的处理程序)。

为什么这样做,为什么只针对 systemIO.popen,而不是 %x{}fork{} ?

最佳答案

作为解决方法,您可以自己传播 SIGINT。您可以检查系统命令是否由于信号而退出,如果是则引发 SIGINT:

ruby1.8 -e 'system "sleep 100"; p $?; Process.kill("INT",0) if $?.signaled?; sleep'

关于ruby - 中断从 ruby 调用的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15754350/

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