程序不響應我的信號
我的系統上有一個奇怪的行為。
當我在 shell(bash 版本 4.2.45(1)-release)中呼叫命令時,比如說
top
orcat
,正在執行的程序(程序)不響應Ctrl
+C
。我什至嘗試執行kill -2 <pid>
andkill -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
這就是它應該是什麼樣子。如果你在一個帶有專有 nVidia 驅動程序的系統上執行它,你會看到你的許多程序的各種瘋狂值
BLOCKED
——可能包括所有行為不端的程序。請注意,信號遮罩是通過
fork
/從父程序傳遞給子exec
程序的,因此一旦父程序有一個損壞的程序,它從該點產生的所有子程序也將如此。另請參閱我的問題*升級後,標題欄中的 X 按鈕不再關閉 xterm*和您現在可以找到的各種發行版錯誤,知道要查看哪個包。您可以修改我對該問題的回答中的程式碼,將信號遮罩重置為無阻塞(省略
sigaddset
並更改SIG_UNBLOCK
為SIG_SETMASK
)。