中断的孩子叫红宝石

tig*_*tig 13 ruby

为什么用使用call来创建的子进程中断ruby进程system不会中断ruby进程本身?它们应属于同一组,因此应该被中断.这对ruby2.0也无效.

鉴于ruby 1.8.7补丁371,ruby 1.9.3补丁392和ruby2.0补丁0:

ruby1.8 -e 'system "sleep 100"; p $?; sleep'在bash中运行并按^C仅会杀死内部调用sleep 100.

Ruby 1.9的行为完全相同.

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

- 编辑 -

读取源我已经发现处理SIGINT,SIGQUIT并且SIGHUPrb_syswait等待创建的子进程完成然后恢复处理程序的方法中被切换为忽略(rb_syswaitruby v1.8.7-p370中,ruby v1.9.3-p362并且在ruby中没有阻塞处理程序v2.0.0-p0).

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

Mar*_* K. 1

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

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