我正在使用 POSIX 接口进行一些套接字编程。我试图使用 select() 函数来监视非阻塞套接字何时准备好读/写。
当使用 select() 函数时,我给它一组读写文件描述符。具体来说,我有一个套接字 fd,我想检查它是否可读且可写。
这POSIX 文档声明返回值是所有 fd 集中所有文件描述符的总和。
我的早期测试表明我得到了“2”,这很好(这意味着我的套接字既可读又可写)。但是,如果文件描述符不同时变得可读/可写会发生什么?假设它在变得可写之前一微秒就变得可读了?会发生什么?它只是返回 1 吗?
答案1
select()
当至少一个文件描述符准备好读取或写入时,或者达到超时时,或者被信号中断时,将返回。
这意味着您必须select()
在确定至少一个文件描述符已准备好读取或写入后测试给定的文件描述符集(这些集由 修改select()
)。
成功完成后,
pselect()
或select()
函数readfds
应修改、writefds
和参数指向的对象,errorfds
以分别指示哪些文件描述符已准备好读取、准备写入或有待处理的错误条件,并应返回所有输出集中的就绪描述符总数。对于每个小于 的文件描述符nfds
,如果在输入时设置了相应位并且该文件描述符的相关条件为真,则应在成功完成时设置相应位。
如果您需要打开文件描述符以进行读取和写入,则必须循环select()
直到满足这两个条件。