Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
中断从ruby调用的子对象_Ruby - Fatal编程技术网

中断从ruby调用的子对象

中断从ruby调用的子对象,ruby,Ruby,为什么用调用系统创建的子进程中断ruby进程不会中断ruby进程本身?它们应该属于同一个组,因此应该同时被打断。此外,这对ruby2.0无效 给定ruby 1.8.7补丁371、ruby 1.9.3补丁392和ruby2.0补丁0: 运行ruby1.8-e'系统“睡眠100”;p$?;在bash中休眠“,然后按⌃C只终止对睡眠100的内部调用 Ruby 1.9的行为相同 虽然运行了ruby2.0-e'系统“sleep 100”;p$?;sleep'中断内部命令和ruby进程本身。2.0.0-p0

为什么用调用
系统创建的子进程中断ruby进程不会中断ruby进程本身?它们应该属于同一个组,因此应该同时被打断。此外,这对ruby2.0无效

给定ruby 1.8.7补丁371、ruby 1.9.3补丁392和ruby2.0补丁0:

运行
ruby1.8-e'系统“睡眠100”;p$?;在bash中休眠“
,然后按⌃C只终止对睡眠100的内部调用

Ruby 1.9的行为相同

虽然运行了
ruby2.0-e'系统“sleep 100”;p$?;sleep'
中断内部命令和ruby进程本身。2.0.0-p0

--编辑--

阅读源代码时,我发现在
rb_syswait
方法中,处理
SIGINT
SIGQUIT
SIGHUP
被切换为忽略,然后等待创建的子进程完成,然后恢复处理程序(
rb_syswait
in,并且在中不阻塞处理程序)


为什么要这样做?为什么只针对
系统
IO.popen
,而不是
%x{}
fork{}

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

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

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

您想知道实现细节还是如何解决这个问题?@SemyonPerepelitsa:两者+什么应该被视为正常behaviour@SemyonPerepelitsa现在,只有当流程正在处理中断时,为什么要这样做和最佳解决方案才没有帮助:
ruby1.8-e“系统%q{ruby1.8-e”信号。陷阱(%q{INT}{exit};睡眠10“};p$?;进程终止(“INT”,0),如果$?。发出信号?;睡眠“
@tig这是真的。在这种情况下,您需要其他方式(可能是子进程中的特殊退出代码)来指示子进程接收到信号。@tig,对,这只是一个示例。毕竟,这只是一个解决办法。。。我不认为有一种变通方法可以在所有情况下使用。区别在于ruby,请在提供的链接中比较源代码运行
strace
下的两个命令并比较输出。可能在一种情况下调用了
setpgid
,而在另一种情况下不调用?