Мое понимание заключается в следующем:Как системные вызовы прерываются сигналом?
блокирующий системный вызов обычно помещает процесс в государстве «TASK_INTERRUPTIBLE», так что, когда сигнал подается, ядро помещает процесс в состояние «TASK_RUNNING». И процесс будет запланирован для запуска, когда произойдет следующий тик таймера, так что syscall будет прерван.
Но я сделал небольшое испытание, оно потерпело неудачу. Я worte процесс usermode, который называется sleep(). И я изменил состояние процесса на TASK_RUNNING в ядре, но sleep() не был прерван вообще, и процесс все еще спал.
Затем я попробовал wake_up_process (process), это не удалось.
Затем я попробовал set_tsk_thread_flag (процесс, TIF_SIGPENDING), он не прошел.
Затем я попробовал set_tsk_thread_flag (процесс, TIF_SIGPENDING) и wake_up_process (process), успешно! sleep() был прерван, и процесс начал работать.
Так что все не так просто. Кто-нибудь знает, как именно системные вызовы прерываются сигналом?
Если вы просто вызываете 'wake_up_process()', тогда процесс просыпается, проверяет, что происходит, и обнаруживает, что нет причин проснуться, поэтому он сразу возвращается к сна. Если вы просто установите флаг без пробуждения процесса, то он не проснется, поэтому не проверяет флаг. Вам нужно сделать то и другое. – caf