Max*_* S. 5 command-line process kill terminal signals
我的系统上有一个奇怪的行为。
当我在 shell(bash 版本 4.2.45(1)-release)中调用命令时,比如说topor cat,正在运行的程序(进程)不响应Ctrl+ C。我什至试图运行kill -2 <pid>和kill -15 <pid>,但它没有帮助。但是,我可以使用SIGKILL.
我拥有该进程,我什至尝试以 root 身份向该进程(信号 2 和 15)发送信号,但它没有响应。top如果按 ,我可以退出q。
关于这个问题的任何想法?或者有什么提示可以解决它?
更新 1
cat而top只是例子。所有进程都具有相同的行为。我试图编写一个简单的程序来只睡觉(没有信号处理程序),我有同样的行为。
更新 2
我写了一个小程序只用来睡觉。这次我安装了信号处理程序来捕获SIGTERM和SIGINT。当我调用kill -15 <pid>(以及使用-2)时,我的程序没有收到信号!
我也更新了内核3.11.10-100.fc18.i686,仍然有同样的问题。
最新版本的 nVidia 专有驱动程序(可能与其他最新版本的库结合)有一个错误,导致它们破坏信号掩码。
您可以像这样查看信号掩码:
anthony@Zia:~$ ps -eo blocked,pid,cmd | egrep -v '^0+ '
BLOCKED PID CMD
fffffffe7ffbfeff 605 udevd --daemon
0000000000000002 4052 /usr/lib/policykit-1/polkitd --no-debug
0000000000087007 4646 /usr/sbin/mysqld --basedir=/usr […]
0000000000010000 15508 bash
Run Code Online (Sandbox Code Playgroud)
这就是它应该是什么样子。如果您在具有专有 nVidia 驱动程序的系统上运行它,您会看到 , 的各种疯狂值BLOCKED,对于您的许多程序 - 可能包括所有行为不端的程序。
请注意,信号屏蔽是由父母传给子女通过fork/ exec,所以一旦父进程有腐败之一,它产生从该点向前将所有的孩子。
另请参阅我的问题升级后,标题栏中的 X 按钮不再关闭 xterm和您现在可以找到的各种发行版错误,知道要查看哪个包。您可以修改我对该问题的回答中的代码,将信号掩码重置为无阻塞(省略sigaddset并更改SIG_UNBLOCK为SIG_SETMASK)。