当linux系统调用被阻止时,如何以及何时设置-EINTR

时间:2013-11-30 09:33:25

标签: linux linux-kernel operating-system signals system-calls

如果系统调用被阻止,则进程状态将设置为TASK_INTERRUPTIBLE,并且该进程将从运行队列中删除。 当信号传递到该进程时,内核会将信号添加到待处理信号列表中,并将进程状态设置为TASK_RUNNING。 当下次调用schedule()时,将执行此过程。 我不明白的是,系统调用的确切阻塞如何将-EINTR返回给用户空间? 任何被阻止的系统调用都可以返回-EINTR? 设置-EINTR的逻辑是由信号处理代码还是系统调用本身完成的? AFAIK信号处理只在返回用户空间之前发生,是真的吗? 上下文切换期间是否发生信号处理? 请帮我理解这一点。

1 个答案:

答案 0 :(得分:0)

当进程再次运行时(即schedule()返回时),驱动程序必须使用signal_pending()函数检查此情况,并中止它正在执行的操作并返回-EINTR错误代码。

许多系统调用可重启,即在被信号中断后,可以再次执行它们而不更改功能。 在这种情况下,它们返回-ERESTARTSYS而不是-EINTR,内核将在处理完信号后自动处理重启。

有关示例,请参阅uart_wait_modem_status中的drivers/tty/serial/serial_core.c功能,或使用EINTRERESTARTSYS的任何其他地方。