为什么用调用创建的子进程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 )。
为什么它完成了,为什么只为systemand IO.popen,而不是%x{}or fork{}?