mia comprensione è come segue:In che modo le chiamate di sistema vengono interrotte dal segnale?
la chiamata di sistema di bloccaggio normalmente mettere il processo in stato 'TASK_INTERRUPTIBLE' in modo tale che quando un segnale viene consegnato, il kernel pone il processo in stato di 'TASK_RUNNING'. E il processo verrà programmato per essere eseguito quando si verifica il successivo tick del timer, in modo che il syscall venga interrotto.
Ma ho fatto un piccolo test, non è riuscito. Ho creato un processo usermode, che ha chiamato sleep(). E ho cambiato lo stato del processo in TASK_RUNNING nel kernel, ma sleep() non è stato affatto interrotto e il processo stava ancora dormendo.
Quindi ho provato wake_up_process (processo), non è riuscito.
Quindi ho provato set_tsk_thread_flag (processo, TIF_SIGPENDING), non è riuscito.
Quindi ho provato set_tsk_thread_flag (processo, TIF_SIGPENDING) e wake_up_process (processo), riuscito !! sleep() è stato interrotto e il processo ha iniziato a funzionare.
Quindi non è così semplice. Qualcuno sa esattamente come le chiamate di sistema vengono interrotte dal segnale?
Se si chiama semplicemente "wake_up_process()", il processo si riattiva, controlla per vedere cosa succede e scopre che non c'era motivo di riattivare, quindi torna immediatamente in stato di stop. Se imposti il flag senza svegliare il processo, allora non si attiva, quindi non controlla la flag. Devi fare entrambe le cose. – caf