2010-07-06 119 views
0

我發現了一個奇怪的場景,如果我開始一個Java程序,我想用CTRL +ç優雅退出它不工作/響應,我不得不做一個CTRL + z關於該程序,這不是很酷,做一個ps列出過程...任何人都請。CTRL-C不能在Java程序工作

+0

你能發表一些代碼嗎? – 2010-08-24 21:20:29

回答

3

在Unix下,命令行程序對您嘗試使用^C中斷它們時發生的情況有很大的控制權。在終端鍵入^C的默認效果是使內核將SIGINT信號發送到前臺進程組,並且SIGINT的默認行爲是終止它發送到的進程,但這兩件事都可以更改。

問題的最可能的原因是您的Java程序攔截SIGINT爲了在退出之前做一些清理,但信號處理程序有問題,所以該進程並沒有真正退出。第二個最可能的原因是程序是,完全忽略了SIGINT。最不可能的原因是它將終端置於「原始模式」,因此^C只是向其標準輸入傳送一個值爲0x03的字節(如果它已經完成^Z可能也不會起作用)。

如果您有權訪問程序的源代碼,您可以嘗試修復有問題的信號處理程序和/或使其停止忽略信號。否則,你有點兒小溪。您可以嘗試使用^\(控制反斜槓),它會發送一個不同的正常致命信號(SIGQUIT),但這並不保證可以正常工作,如果確實有效,它可能會讓您產生巨大的「核心轉儲」文件擺脫。

擺脫故障過程的唯一方法是發送信號9(SIGKILL)。與其他致命信號不同,不可能攔截,阻止或忽略該信號。沒有控制鍵發送信號9;您必須暫停^Z的過程,或者打開新的終端窗口/ ssh會話,使用ps找到進程ID,並使用kill命令。在kill -9 PID之前總是嘗試kill PID