为什么用使用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并且SIGHUP在rb_syswait等待创建的子进程完成然后恢复处理程序的方法中被切换为忽略(rb_syswait在ruby v1.8.7-p370中,ruby v1.9.3-p362并且在ruby中没有阻塞处理程序v2.0.0-p0).
为什么要这样做,为什么只为system和IO.popen,而不是%x{}或fork{}?
作为解决方法,您可以自行传播 SIGINT。您可以检查系统命令是否由于信号而退出,如果是则引发 SIGINT:
ruby1.8 -e 'system "sleep 100"; p $?; Process.kill("INT",0) if $?.signaled?; sleep'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
442 次 |
| 最近记录: |