Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么信号处理程序不能在系统调用期间运行?_Linux_Signals - Fatal编程技术网

Linux 为什么信号处理程序不能在系统调用期间运行?

Linux 为什么信号处理程序不能在系统调用期间运行?,linux,signals,Linux,Signals,在Linux中,等待IO的进程可以处于TASK\u INTERRUPTIBLE或TASK\u unterruptible两种状态之一 例如,后一种情况是进程等待从常规文件读取的完成。如果读取需要很长时间或很长时间(无论出于何种原因),则会导致进程在此期间无法接收任何信号的问题 前一种情况是,例如,等待从套接字读取(这可能需要无限的时间)。但是,如果这样的read调用被中断,则会导致一个问题,即程序员/用户需要正确处理errno==EINTER条件,而他可能会忘记这一点 我的问题是:难道不可能允许

在Linux中,等待IO的进程可以处于
TASK\u INTERRUPTIBLE
TASK\u unterruptible
两种状态之一

例如,后一种情况是进程等待从常规文件读取的
完成。如果读取<代码>需要很长时间或很长时间(无论出于何种原因),则会导致进程在此期间无法接收任何信号的问题

前一种情况是,例如,等待从套接字读取
(这可能需要无限的时间)。但是,如果这样的
read
调用被中断,则会导致一个问题,即程序员/用户需要正确处理
errno==EINTER
条件,而他可能会忘记这一点


我的问题是:难道不可能允许所有系统调用都被信号中断,而且,在信号处理程序运行后,原始系统调用仅仅继续它的业务吗?这难道不能解决这两个问题吗?如果不可能,为什么?

问题的两部分是相关的,但我可能消化了太多的加糖蛋酒,无法确定这里是否存在如此多的一对一关系,而不是一对多的关系

在内核方面,我认为几年前添加了一个
TASK\u KILLABLE
状态。这样做的结果是,当进程在系统调用中被阻塞时(无论出于何种原因),如果内核遇到一个无论如何都会杀死进程的信号,它就会顺其自然。这降低了进程永久处于不可中断状态的可能性。我不知道在改变单个系统调用以利用该选项方面取得了什么进展


在用户端,
SA_RESTART
及其方便的函数
sigcrupt
可以减轻应用程序程序员的痛苦。但事实上,这些都是针对每个信号指定的,并不是所有系统调用都遵守这些规则,这很好地说明,有一些原因导致您提出的一揽子中断方案无法实现,或者至少很容易实现。仅仅考虑信号矩阵、单个系统调用、历史上预期并支持行为的调用(以及基于其系统血统的多个历史语义!)的可能交互就有点令人眩晕。但也许这就是问题的症结所在。

简短的答案是否定的。长答案将涉及到比我熟悉的更深入的CPU和操作系统内部。