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