如果系统调用被阻止,则进程状态将设置为TASK_INTERRUPTIBLE
,并且该进程将从运行队列中删除。
当信号传递到该进程时,内核会将信号添加到待处理信号列表中,并将进程状态设置为TASK_RUNNING
。
当下次调用schedule()
时,将执行此过程。
我不明白的是,系统调用的确切阻塞如何将-EINTR
返回给用户空间?
任何被阻止的系统调用都可以返回-EINTR
?
设置-EINTR
的逻辑是由信号处理代码还是系统调用本身完成的?
AFAIK信号处理只在返回用户空间之前发生,是真的吗?
上下文切换期间是否发生信号处理?
请帮我理解这一点。
答案 0 :(得分:0)
当进程再次运行时(即schedule()
返回时),驱动程序必须使用signal_pending()
函数检查此情况,并中止它正在执行的操作并返回-EINTR
错误代码。
许多系统调用可重启,即在被信号中断后,可以再次执行它们而不更改功能。
在这种情况下,它们返回-ERESTARTSYS
而不是-EINTR
,内核将在处理完信号后自动处理重启。
有关示例,请参阅uart_wait_modem_status
中的drivers/tty/serial/serial_core.c
功能,或使用EINTR或ERESTARTSYS的任何其他地方。