2010-11-10 24 views
0

我知道/ sbin/init對內核的SIGKILL和SIGSTOP有特殊的保護,原因很明顯。允許/ sbin/init被SIGSTOPed?

我試圖告訴內核我想收到的ioctl SIGSTOP()(類似SIGABRT和SIGSEGV請求數在main()):

if (ioctl (0, KDSIGACCEPT, SIGSTOP) == 0) { 
    nih_signal_set_handler (SIGSTOP, stop_handler); 

但停止不到位的stop_handler()(從我所知,因爲nih_error()不打印在日誌中)。在STOP_handler()中,我將STOP sighandler重置爲SIG_DFL(否則它會回到我們的處理程序),但這可能導致它被內核忽略。

如何告訴內核我想讓init STOPPED?

+0

也許你可以解釋你試圖達到的目標是什麼? – MarkR 2010-11-10 17:13:43

回答

2

您需要從其任務結構的signal_struct標誌中取出SIGNAL_UNKILLABLE標誌。

默認情況下(即始終在未修改的Linux系統上)SIGNAL_UNKILLABLE標誌設置在init的signal_struct標誌上。

你可以編寫一個內核模塊來調用init的任務結構來改變它,然後你就可以發送一個停止信號給init。

雖然向init發送停止信號是一個非常糟糕的主意,因爲如果init沒有收穫它們,殭屍會迅速擴散。


說明:這是一個內核內部結構,不是init的源代碼的一部分,也不能從用戶空間訪問或看到。要改變它,你需要編寫一些內核代碼或修補內核。我想,編寫一個內核模塊就可以了。

+0

謝謝你的回答。我可以在init的源代碼中更改任務結構並重新編譯它,還是需要提到的內核模塊方法?我知道停止init會導致正常情況的含義。我需要爲特定情況啓用此功能,最終導致重啓。 – Tuminoid 2010-11-10 17:09:18

+0

我已經澄清了上面的內容(這是一個內核結構)。 – MarkR 2010-11-10 17:12:53