我的理解如下:
阻塞系统调用通常会将进程置于“TASK_INTERRUPTIBLE”状态,以便在传递信号时,内核将进程置于“TASK_RUNNING”状态。并且该进程将被安排在下一个计时器滴答发生时运行,从而中断系统调用。
但是我做了一个小测试,失败了。我编写了一个名为 sleep() 的用户模式进程。我将进程的状态更改为内核中的 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() 被中断,进程开始运行。
所以事情没那么简单。有谁知道系统调用究竟是如何被信号中断的?