ruby - 我可以在 ruby​​ 中捕获 control-q 和 control-s 吗?

标签 ruby signals

对于某些信号,例如 SIGINT,我可以轻松地设置陷阱来处理信号并继续执行我认为合适的操作。我想将 ^q 和 ^s 的典型行为添加到我正在摆弄的 ruby​​ 命令行应用程序中。有没有办法做到这一点 - 特别是一种可移植的方法,以便我可以在 Windows、iOS、Linux 和 Solaris 中使用它?

编辑:

事实证明,信号从未传递到进程。事实上,在该进程及其父进程(一个 bash 实例)上运行 strace 表明该进程和父进程都没有得到任何有关正在发生的情况的指示。他们只是被暂停了。

我可能会尝试让 SIGALARM 处理程序每​​秒触发一次,检查自上次警报以来是否已经过去了超过一秒,如果得出结论认为进程已挂起,则进行适当的调用。在负载较重的系统上可能会出现误报。

最佳答案

在irb中输入Signal.list 。它将列出您应该能够捕获的所有信号。

在 ruby​​ 中捕获信号:

Signal.trap("STOP") do
  # handle the signal
end

在终端中输入$ stty -a 。它应该列出信号及其关联的组合键(如果有的话)。

我相信 ^s 通常是 stop ^q 是 start .

虽然根据this answer ,这些组合键实际上并不向正在运行的进程发送信号,而是向终端驱动程序发送信号。在这种情况下,kill -STOP <process>可以将该信号发送到您的进程。

关于ruby - 我可以在 ruby​​ 中捕获 control-q 和 control-s 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12375905/

相关文章:

ruby - 带有 sinatra 的 Postgres 在部署时产生 "database does not exist"

ruby - Sinatra:使用其他文件中的路由

c++ - 在多线程进程中处理信号的例子

ruby-on-rails - Rails 地理编码器 "undefined method error"

ruby-on-rails - Mongoid - 同一个外域的两个逆域

ruby - 实例变量在 'dup'之后仍然引用

haskell - 中断 MonadState 中冗长的纯计算

python - 为什么 Python 信号处理程序没有被触发?

android - 如何从路由器获取所有错误信息并在应用程序中显示

在多线程程序中捕获 SIGINT