进程不响应我的信号

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

cattop只是例子。所有进程都具有相同的行为。我试图编写一个简单的程序来只睡觉(没有信号处理程序),我有同样的行为。

更新 2

我写了一个小程序只用来睡觉。这次我安装了信号处理程序来捕获SIGTERMSIGINT。当我调用kill -15 <pid>(以及使用-2)时,我的程序没有收到信号!

我也更新了内核3.11.10-100.fc18.i686,仍然有同样的问题。

der*_*ert 6

最新版本的 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_UNBLOCKSIG_SETMASK)。