【发布时间】:2023-04-01 23:33:01
【问题描述】:
在 Linux 中,等待 IO 的进程可以处于 TASK_INTERRUPTIBLE 或 TASK_UNINTERRUPTIBLE 的任一状态。
例如,后者是进程等待直到来自常规文件的read 完成的情况。如果这个read 需要很长时间或永远(无论出于何种原因),则会导致进程在此期间无法接收任何信号的问题。
前一种情况是,例如,一个人等待来自套接字的read(这可能需要无限的时间)。但是,如果这样的read 调用被中断,则会导致需要程序员/用户正确处理errno == EINTER 条件的问题,他可能会忘记这一点。
我的问题是:难道不能让所有系统调用都被信号中断,而且,在信号处理程序运行后,原始系统调用会继续其业务吗?这不是解决了这两个问题吗?如果不可能,为什么?
【问题讨论】:
-
简短的回答是否定的。长答案将涉及比我熟悉的更深入的 CPU 和操作系统内部。