Command-Line

程序不響應我的信號

  • January 18, 2014

我的系統上有一個奇怪的行為。

當我在 shell(bash 版本 4.2.45(1)-release)中呼叫命令時,比如說topor cat,正在執行的程序(程序)不響應Ctrl+ C。我什至嘗試執行kill -2 <pid>and kill -15 <pid>,但沒有幫助。但是,我可以使用SIGKILL.

我擁有該程序,我什至嘗試以 root 身份向程序(信號 2 和 15)發送信號,但它沒有響應。top如果按,我可以退出q

關於這個問題的任何想法?或者有什麼提示可以解決它?

更新 1

cat並且top只是例子。所有程序都有相同的行為。我試圖編寫一個簡單的程序來僅休眠(沒有信號處理程序)並且我有相同的行為。

更新 2

我只寫了一個小程序來睡覺。這次我安裝了信號處理程序來擷取SIGTERMSIGINT. 當我呼叫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

這就是它應該是什麼樣子。如果你在一個帶有專有 nVidia 驅動程序的系統上執行它,你會看到你的許多程序的各種瘋狂值BLOCKED——可能包括所有行為不端的程序。

請注意,信號遮罩是通過fork/從父程序傳遞給子exec程序的,因此一旦父程序有一個損壞的程序,它從該點產生的所有子程序也將如此。

另請參閱我的問題*升級後,標題欄中的 X 按鈕不再關閉 xterm*和您現在可以找到的各種發行版錯誤,知道要查看哪個包。您可以修改我對該問題的回答中的程式碼,將信號遮罩重置為無阻塞(省略sigaddset並更改SIG_UNBLOCKSIG_SETMASK)。

引用自:https://unix.stackexchange.com/questions/109694