select() 可以防止 read() 被打断吗?

can select() prevent read() from getting interrupted?

根据POSIX,如果我们使用select()来决定何时可以使用无阻塞读取,是否有可能read()被信号中断并且returns EINTR?

您的阅读肯定会被信号打断。 select 只保证 read 不会被阻塞。对于信号可能造成的中断,它绝对没有什么可说的。

来自man page

select() allows a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready" for some class of I/O operation (e.g., input possible). A file descriptor is considered ready if it is possible to perform a corresponding I/O operation (e.g., read(2), or a sufficiently small write(2)) without blocking.

而且,select如何预测未来呢?它知道现在套接字有一些可以读取的数据。当您尝试读取此数据时,它如何告诉您是否会发出信号?

If we use a select() to decide when we can use a read without blocking, is it possible that the read() is interrupted by a signal and returns EINTR?

是的。

我推断这个问题至少部分是由于认识到 read() 表示 EINTR 仅当它被中断 在传输任何数据之前 .但是“在传输任何数据之前”与“在数据变得可用时被阻止”是不同的。就规范而言,是否有任何数据可供读取的问题,使得 read() 调用不会阻塞,与 read() 调用是否可能被中断的问题是正交的在传输任何数据之前通过信号。

如果您要查找的不止于此,那么还要考虑 read() 是一个取消点,因此它会在输入时检查是否有待处理的取消请求。由于它在执行任何数据传输之前会做一些重要的工作,因此至少有一个狭窄的 window,其中 read() 可以在开始传输数据之前接收到信号,即使数据已经可用。