Linux 为什么信号处理程序不能在系统调用期间运行?
在Linux中,等待IO的进程可以处于Linux 为什么信号处理程序不能在系统调用期间运行?,linux,signals,Linux,Signals,在Linux中,等待IO的进程可以处于TASK\u INTERRUPTIBLE或TASK\u unterruptible两种状态之一 例如,后一种情况是进程等待从常规文件读取的完成。如果读取需要很长时间或很长时间(无论出于何种原因),则会导致进程在此期间无法接收任何信号的问题 前一种情况是,例如,等待从套接字读取(这可能需要无限的时间)。但是,如果这样的read调用被中断,则会导致一个问题,即程序员/用户需要正确处理errno==EINTER条件,而他可能会忘记这一点 我的问题是:难道不可能允许
TASK\u INTERRUPTIBLE
或TASK\u unterruptible
两种状态之一
例如,后一种情况是进程等待从常规文件读取的完成。如果读取<代码>需要很长时间或很长时间(无论出于何种原因),则会导致进程在此期间无法接收任何信号的问题
前一种情况是,例如,等待从套接字读取(这可能需要无限的时间)。但是,如果这样的read
调用被中断,则会导致一个问题,即程序员/用户需要正确处理errno==EINTER
条件,而他可能会忘记这一点
我的问题是:难道不可能允许所有系统调用都被信号中断,而且,在信号处理程序运行后,原始系统调用仅仅继续它的业务吗?这难道不能解决这两个问题吗?如果不可能,为什么?问题的两部分是相关的,但我可能消化了太多的加糖蛋酒,无法确定这里是否存在如此多的一对一关系,而不是一对多的关系
在内核方面,我认为几年前添加了一个TASK\u KILLABLE
状态。这样做的结果是,当进程在系统调用中被阻塞时(无论出于何种原因),如果内核遇到一个无论如何都会杀死进程的信号,它就会顺其自然。这降低了进程永久处于不可中断状态的可能性。我不知道在改变单个系统调用以利用该选项方面取得了什么进展
在用户端,SA_RESTART
及其方便的函数sigcrupt
可以减轻应用程序程序员的痛苦。但事实上,这些都是针对每个信号指定的,并不是所有系统调用都遵守这些规则,这很好地说明,有一些原因导致您提出的一揽子中断方案无法实现,或者至少很容易实现。仅仅考虑信号矩阵、单个系统调用、历史上预期并支持行为的调用(以及基于其系统血统的多个历史语义!)的可能交互就有点令人眩晕。但也许这就是问题的症结所在。简短的答案是否定的。长答案将涉及到比我熟悉的更深入的CPU和操作系统内部。