【问题标题】:SIGINT not being captured after using ruby system() command使用 ruby​​ system() 命令后未捕获 SIGINT
【发布时间】:2012-02-02 05:02:38
【问题描述】:

当我运行下面的 ruby​​ 代码时,按 ctrl + c 会立即停止程序

trap("INT") { exit }
while line = gets; puts line; end

但是,当我在获取之前使用 system() 命令时,除非我按“Enter”,否则按 ctrl + c 不会生效。似乎它与 system() 分叉子进程有关,并且父进程无法再检测到 SIGINT。您将如何更改代码以使 ctrl + c 对下面的代码立即生效

trap("INT") { exit }

if system("which ruby > /dev/null")
  puts "ruby is installed"
end

while line = gets; puts line; end

【问题讨论】:

  • 我可以在 debian 和 MacOS 上使用 ruby​​ 1.8.7 重现此行为。
  • 我在 MacOS 上使用 ruby​​-1.8.7-p357
  • 但是当我切换到 ruby​​-1.9.2-p290 时,它们的响应方式相同

标签: ruby unix fork signals


【解决方案1】:

这看起来像是 1.9 中修复的信号处理中的一个错误,为了解决您的问题,在系统调用之后定义信号陷阱:

if system("which ruby > /dev/null")
  puts "ruby is installed"
end
trap("INT") { p 'Ciao!'; exit }
while line = gets; puts line; end

不理想,但可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多