对于某些信号,例如 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/