升級後,標題欄中的 X 按鈕不再關閉 xterm
理論上,按下關閉按鈕應該關閉一個 xterm。在我做
aptitude upgrade
. (我正在執行 Debian 測試)。但現在它沒有了——點擊 X 什麼也沒做——而只是對某些xterms 而言。特別是,如果我從 KDE 快速啟動或 K 菜單啟動 xterm,則這些 xterm 是可關閉的。但是,如果我從鍵盤快捷鍵 (khotkeys) 啟動它,則該 xterm 是不可關閉的。
此外,這是遞歸的:如果我從一個 xterm 啟動一個 xterm,如果它的父項是,它是可關閉的。
這一般不會發生。它僅適用於 xterm。我已經測試過從不可關閉的 xterm 啟動這些應用程序,它們都是可關閉的:
- gvim
- 時鐘
- xditview
- 海豚
- 控制台
在那裡穿插另一個程序會破壞鏈條(例如,從 konsole 啟動一個 xterm):
- xterm(不可關閉)→ xterm(不可關閉)→ xterm(不可關閉)→ …
- xterm(不可關閉)→ konsole(可關閉)→ xterm(可關閉)→ …
我檢查了我的 kwin 視窗規則,我沒有任何 xterm。
更新:這是 nVidia
Stephen Dowdy 回應了 Debian 錯誤報告並暗示它可能是一個 nVidia 錯誤。它正在破壞信號遮罩。一些搜尋發現Debian Bug #728743,確實切換到 Nouveau/MESA(開源驅動程序)已經解決了這個問題。
請注意,降級到較舊的 nVidia 驅動程序並沒有,這可能意味著它的 nVidia 驅動程序 + 其他一些較新版本的東西,我沒有費心去追查,因為該錯誤的評論者聲稱它已在 331.38 中修復。(我現在正在執行 331.49,它確實已修復)。
來自 strace 的結果
我在兩個版本上都執行了 strace。經過一些過濾(以使 diff 更好地工作),我看到一堆行,例如:
WORKING rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 *vs* BROKEN rt_sigprocmask(SIG_BLOCK, NULL, [HUP], 8) = 0
看來損壞的版本已阻止 SIGHUP。點擊 X 似乎發送了一個 SIGHUP,該信號被忽略,因此 shell 不會退出。您可以通過將 SIGHUP 擷取在 shell 中而不退出(但不是相反,因為 shell 似乎永遠不會獲得 HUP)來使工作中斷。
我已經為此送出了Debian bug #733816。
作為一種解決方法,您可以使用這個簡單的 C 程序包裝熱鍵命令:
#include <signal.h> #include <stddef.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { sigset_t set; if (argc < 2) { fprintf(stderr, "ERROR: Expected at least a command to run\n" "\n" "USAGE: %s command [arguments]\n", argv[0]); exit(EXIT_FAILURE); } sigemptyset(&set); sigaddset(&set, SIGHUP); sigprocmask(SIG_UNBLOCK, &set, NULL); execvp(argv[1], argv+1); }
通過編譯(比如說,to
~/bin/unblock-hup
)然後呼叫~/bin/unblock-hup xterm
而不是呼叫它來使用它xterm
。請注意,在自定義快捷方式控制模組中,您必須將完整路徑放入主目錄;~
不起作用。