私の理解は次のとおりです。
ブロッキング syscall は通常、プロセスを「TASK_INTERRUPTIBLE」状態にするため、シグナルが配信されると、カーネルはプロセスを「TASK_RUNNING」状態にします。そして、次のタイマーティックが発生したときにプロセスが実行されるようにスケジュールされるため、syscall は中断されます。
しかし、私は小さなテストを行いましたが、失敗しました。sleep() を呼び出すユーザーモード プロセスを書きました。そして kernel でプロセスの状態を TASK_RUNNING に変更しましたが、 sleep() はまったく中断されず、プロセスはスリープ状態のままでした。
次に、 wake_up_process(process) を試しましたが、失敗しました。
それから set_tsk_thread_flag(process,TIF_SIGPENDING) を試しましたが、失敗しました。
次に、set_tsk_thread_flag(process,TIF_SIGPENDING) と wake_up_process(process) を試してみましたが、成功しました!! sleep() が中断され、プロセスが実行を開始しました。
それほど単純ではありません。システムコールが signal によってどのように中断されるかを知っている人はいますか?