为什么用调用创建的子进程system
中断 ruby 进程不会中断 ruby 进程本身?他们应该属于同一个组,所以都应该被打断。这也对 ruby2.0 无效。
给定 ruby 1.8.7 补丁 371、ruby 1.9.3 补丁 392 和 ruby2.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
,SIGQUIT
并SIGHUP
在方法中切换为忽略,rb_syswait
然后等待创建的子进程完成然后恢复处理程序(rb_syswait
在ruby v1.8.7-p370、ruby v1.9.3-p362中并且没有阻塞ruby 中的处理程序v2.0.0-p0 )。
为什么它完成了,为什么只为system
and IO.popen
,而不是%x{}
or fork{}
?