2013-05-02 116 views
4

我有一個關於內核線程之間信號傳播的查詢。 這種情況是這樣的:被阻止的系統調用不會讓SIGKILL終止進程

從用戶空間應用程序進行系統調用,內核在系統調用中創建一個線程(讓它命名爲thread1)。

現在在thread1中,內核在while循環中循環並且被阻塞。主線程也在while循環中循環。 如果我做了一個「殺-9 <「用戶應用PID>」,該應用程序不能正常退出。即使/ proc入口仍然存在。 雖然在/ proc // FD文件夾爲空。

如果我把下面的主線程的while循環,它正確地並退出捕捉信號。如果我把在線程1的只有下面的while循環,主線程仍然不會退出。

if (signal_pending(current)) { 
    return; 
} 

能否請你建議,在這種情況下內核應該如何處理kill -9信號?在SIGKILL之後,進程的狀態變成Zombie。

該系統調用以下實現:

thread1 = kthread_create(thread_fn, NULL, "thread1"); 
if (thread1) { 
    wake_up_process(thread1); 
} 
printk(KERN_NOTICE "Main thread: current:%s\n", current->comm); 
while(1) { 
    DELAY_SEC(1) 

的thread_fn是:

int thread_fn(void* data) 
{ 
    while(1) { 
     DELAY_SEC(1) 
    } 
} 

問候,

索尼卡

+0

你如何創建一個殭屍程序呢? – alk 2013-05-02 10:39:20

回答

1

發送一個信號給處理只是設置用於相應的標誌這個信號。

當進程從內核模式返回時(例如,系統調用返回時),將檢查這些標誌。如果其中之一是先前設定的,則採取相應的行動。

由於您的系統調用永不返回,因此這種情況不會發生。

換句話說:你不能真的殺死一個Linux進程。你可以禮貌地要求它死亡。