有时我运行一个命令(在 GNU/Linux 上),当我按下+ping
时它不会立即停止。CtrlC
据我了解,Ctrl+C发送 SIGINT。ping
命令未立即退出的可能原因有哪些?
我该怎么做才能确保它总是立即退出?
答案1
程序可以将自定义处理程序绑定到 SIGINT 信号,例如执行清理操作。您可以使用此 shell 脚本观察此行为,该脚本使用 trap 绑定处理程序:
#!/bin/bash
trap "echo Caught!" SIGINT SIGTERM
while true
do sleep 60
done
要立即终止交互式程序,您可以kill -9 <PID>
在另一个 shell 中执行此操作,或者使用 ctrl-Z 暂停该程序然后终止它:
❯ /tmp/test.sh # Our test script with trap
^CCaught! # Ctrl-c doesn't work
^Z # Suspend the process
[1] + 11713 suspended /tmp/test.sh
❯ kill -9 %1
[1] + 11713 killed
这里我使用 %1 来获取第一个后台进程的 PID,也就是脚本,因为在这个例子中我没有其他后台进程。对于不支持 %1 语法的 shell,您也可以直接使用进程的 PID。
这就是 ping 的作用,看看源代码:在主函数中,设置被称为设置信号处理程序包括 SIGINT。SIGINT 必然会退出,设置一个标志来通知主循环 ping 应该退出。此标志仅在二 地点。我猜测那里使用的某个系统调用被阻塞了或者需要一些时间才能返回,因此标志永远不会被检查或者只能在延迟之后被检查。