13

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

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

在 bash 中运行ruby1.8 -e 'system "sleep 100"; p $?; sleep'并按 ⌃C 只会杀死对sleep 100.

Ruby 1.9 的行为相同。

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

- 编辑 -

阅读源代码我发现处理SIGINT,SIGQUITSIGHUP在方法中切换为忽略,rb_syswait然后等待创建的子进程完成然后恢复处理程序(rb_syswaitruby​​ v1.8.7-p370ruby v1.9.3-p362中并且没有阻塞ruby​​ 中的处理程序v2.0.0-p0 )。

为什么它完成了,为什么只为systemand IO.popen,而不是%x{}or fork{}

4

2 回答 2

1

对于解决方法,您可以自己传播 SIGINT。您可以检查系统命令是否因信号而退出,如果是,则提高 SIGINT:

ruby1.8 -e 'system "sleep 100"; p $?; Process.kill("INT",0) if $?.signaled?; sleep'
于 2013-05-16T15:06:54.947 回答
-1

这似乎不是 Ruby 的问题,而是您没有指定的操作系统的问题。进程分组和低级系统路由由操作系统内核完成。

于 2013-11-14T12:15:45.380 回答