2013-08-05 14 views
5

Moje rozumienie jest następujący:W jaki sposób wywołania systemowe są przerywane sygnałem?

syscall blokowanie normalnie umieścić ten proces w stanie „TASK_INTERRUPTIBLE” tak, że gdy sygnał jest dostarczany, jądro umieszcza proces w stan „TASK_RUNNING”. A proces zostanie zaplanowany do uruchomienia, gdy pojawi się następny tykot zegara, tak aby syscall został przerwany.

Ale zrobiłem mały test, który zawiódł. Przeszukałem proces trybu użytkownika, który wywołał funkcję sleep(). I zmieniłem stan procesu na TASK_RUNNING w jądrze, ale funkcja sleep() nie została w ogóle przerwana, a proces wciąż się przesypiał.

Potem próbowałem wake_up_process (proces), to się nie udało.

Potem próbowałem set_tsk_thread_flag (proces, TIF_SIGPENDING), to się nie udało.

Potem próbowałem set_tsk_thread_flag (proces, TIF_SIGPENDING) i wake_up_process (proces), udało! sleep() został przerwany i proces zaczął działać.

To nie jest takie proste. Czy ktoś wie, w jaki sposób zakłócenia systemowe są przerywane sygnałem?

+0

Jeśli po prostu wywołasz 'wake_up_process()', proces budzi się, sprawdza, co się dzieje, i odkrywa, że ​​nie ma powodu, aby się obudzić, więc idzie prosto z powrotem do snu. Jeśli po prostu ustawisz flagę bez budzenia procesu, to się nie obudzi, więc nie sprawdzi flagi. Musisz zrobić jedno i drugie. – caf

Odpowiedz

2

Zapoznaj się z __send_signal z signal.c. Apeluje complete_signal blisko końca, która ostatecznie nazywa ten mały funkcję:

void signal_wake_up_state(struct task_struct *t, unsigned int state) 
{ 
     set_tsk_thread_flag(t, TIF_SIGPENDING); 
     /* 
     * TASK_WAKEKILL also means wake it up in the stopped/traced/killable 
     * case. We don't check t->state here because there is a race with it 
     * executing another processor and just now entering stopped state. 
     * By using wake_up_state, we ensure the process will wake up and 
     * handle its death signal. 
     */ 
     if (!wake_up_state(t, state | TASK_INTERRUPTIBLE)) 
       kick_process(t); 
} 

A to w jaki sposób to zrobić. Zauważ, że nie wystarczy ustawić flagę wątku: musisz użyć funkcji wybudzania, aby upewnić się, że proces jest zaplanowany.

+0

, Próbowałem wake_up_process() bez ustawiania flagi wątku, również się nie udało. Więc chcę wiedzieć, kiedy i jak połączenia systemowe są zakłócane przez sygnał? – goodjesse

+0

... Ustawiasz flagę wątku, a następnie budzisz proces. Tęskni za jednym z tych dwóch kroków i to nie zadziała. Co to jest niejasne? – nneonneo

Powiązane problemy