select()
就设置哪些标志而言很简单:
但是此规则有很多例外(或者可能是重要的扩展):“w”设置为已完成的非阻塞连接,“r”设置为带有待处理的
listen()
的 accept()
,等等开。
有人找到了在什么情况下设置哪些标志的简单列表吗?
来自此参考页面:
当对带有
清除的输入函数的调用不会阻塞时,无论该函数是否成功传输数据,描述符都应被视为已准备好读取。 (该函数可能会返回数据、文件结束指示或指示其被阻止的错误以外的错误,并且在每种情况下,描述符都应被视为已准备好读取。)O_NONBLOCK
当使用
清除对输出函数的调用不会阻塞时,无论该函数是否成功传输数据,描述符都应被视为已准备好写入。O_NONBLOCK
如果套接字有待处理的错误,则应将其视为有待处理的异常情况。否则,构成异常的条件是特定于文件类型的。
除了异常集中的描述符之外,其他都非常清楚。如果阻塞描述符(无论它是文件、套接字还是其他描述符)不会阻塞,则它在各自的集合中被标记为就绪。接受和接收是“读”操作,而连接和写入是“写”操作。
唯一有问题的是异常状态,这取决于您在集合中传递的描述符的类型。
select的参考,提供select的使用建议