select()和fcntl()之间的差异
按照我的理解,我们可以使用select()和fcntl()之间的差异,c,unix,select,file-descriptor,fcntl,C,Unix,Select,File Descriptor,Fcntl,按照我的理解,我们可以使用fctnl将文件描述符标记为非阻塞,因此每当我们调用该文件描述符上的任何阻塞操作时,它都会出错并修改errno,以指示文件描述符尚未就绪。我们有责任经常轮询文件描述符,并在文件准备就绪时进行读取或写入 使用select,我们传入文件描述符的三个数组(读、写和除),然后select轮询给定时间间隔内的文件描述符,修改数组以指示哪些文件描述符可用于指定操作。而select本身就是一个阻塞操作 现在我的疑问是: 假设我调用选择需要 被读取时,它会超时,而不会检测到任何事件。现
fctnl
将文件描述符标记为非阻塞,因此每当我们调用该文件描述符上的任何阻塞操作时,它都会出错并修改errno
,以指示文件描述符尚未就绪。我们有责任经常轮询文件描述符,并在文件准备就绪时进行读取或写入
使用select
,我们传入文件描述符的三个数组(读、写和除),然后select
轮询给定时间间隔内的文件描述符,修改数组以指示哪些文件描述符可用于指定操作。而select
本身就是一个阻塞操作
现在我的疑问是:
选择需要
被读取时,它会超时,而不会检测到任何事件。现在如果我打电话
read
在其中一个文件描述符上,它将被阻止还是返回
E_会再次阻止/E_,即使我没有先使用fcntl
select()
超时,但您要读取一个未准备好的阻塞文件描述符,那么您将阻塞。调用select()
根本不会影响文件描述符的行为select()
调用将立即返回。如果数据在1秒后准备就绪,则select()
调用将在1秒后返回。如果在这段时间内没有数据准备就绪(或者数据刚好在超时发生之前到达),它将仅在10秒后返回大多数情况下,您需要同时使用两者,尤其是在处理套接字时。例如,
select
可能表示套接字已准备好在Linux上读取,但缓冲数据包的校验和不正确-它仅在读取时进行检查。如果甚至没有一个字节可读取,read
将阻塞。。。所以两者同时存在。啊,好的。谢谢,@AnttiHaapalaI.e。我的观点是,如果您认为非阻塞套接字通常是忙循环的,那么您就错了-select
应该被使用,而2是互补的。