2013-05-02 3 views
4

У меня есть запрос относительно распространения сигналов между потоками ядра. Сценарий выглядит следующим образом:Заблокированный системный вызов не позволяет SIGKILL убить процесс

Из приложения для пользовательского пространства выполняется системный вызов, ядро ​​создает поток (позволяет назвать его thread1) внутри системного вызова.

Теперь внутри этой строки1 ядро ​​зацикливается в цикле while и блокируется. Основной поток также зацикливается в цикле while. Если я выполняю «убить -9 <«приложение пользователя PID>», приложение не может выйти должным образом. Даже запись/прок все еще существует. Хотя/Proc // FD папка становится пустым.

Если я ставлю следующее время цикла основного потока, он ловит сигнал правильно и выходит. Если я ставлю следующий только в thread1 в то время как цикл, основной поток до сих пор не выходит.

if (signal_pending(current)) { 
    return; 
} 

Можете ли вы предложить , как ядро ​​должно вести себя в этом случае с сигналом kill -9? После SIGKILL состояние процесса становится зомби.

Системный вызов имеет следующие реализации:

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

ответ

1

Отправка сигнала процессу просто устанавливает соответствующий флаг для этот сигнал.

Когда процесс возвращается из режима ядра (например, при возврате системного вызова), эти флаги проверяются. Если один из них был ранее установлен, выполняется соответствующее действие.

Поскольку ваш системный вызов никогда не возвращается, этого никогда не произойдет.

Другими словами: Вы действительно не можете убить процесс Linux. Вы можете просто вежливо попросить его умереть.

Смежные вопросы