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?
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