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()
可以在开始传输数据之前接收到信号,即使数据已经可用。
根据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 theread()
is interrupted by a signal and returnsEINTR
?
是的。
我推断这个问题至少部分是由于认识到 read()
表示 EINTR
仅当它被中断 在传输任何数据之前 .但是“在传输任何数据之前”与“在数据变得可用时被阻止”是不同的。就规范而言,是否有任何数据可供读取的问题,使得 read()
调用不会阻塞,与 read()
调用是否可能被中断的问题是正交的在传输任何数据之前通过信号。
如果您要查找的不止于此,那么还要考虑 read()
是一个取消点,因此它会在输入时检查是否有待处理的取消请求。由于它在执行任何数据传输之前会做一些重要的工作,因此至少有一个狭窄的 window,其中 read()
可以在开始传输数据之前接收到信号,即使数据已经可用。