当在边缘触发模式 ( ) 下使用Linux epollEPOLLET
时,读/写失败并带有EAGAIN
/ ,这意味着读/写准备丢失,并且一旦EWOULDBLOCK
准备就绪,就会保证新的准备事件可用epoll_wait()
恢复。
此外,当在边缘触发模式下使用Linux epoll和非阻塞流模式套接字时,如果我们注册了对事件的兴趣EPOLLRDHUP
,并且EPOLLRDHUP
尚未收到事件,则短读/写(返回值小于请求的大小) 也意味着读/写准备的丢失,当重新准备就绪时,我们仍然可以依赖新的准备通知,即使没有读/写因EAGAIN
/失败EWOULDBLOCK
。
类似地,当在边缘触发模式(一旦恢复准备就绪。EV_CLEAR
EAGAIN
EWOULDBLOCK
kevent()
问题:在边缘触发模式下使用Kqueue和非阻塞流模式套接字时,如果我们注册了对事件的兴趣EV_EOF
,并且EV_EOF
尚未收到事件,是否有类似的保证,即短读/写意味着失去读/写准备,并且当重新准备就绪时保证会产生新的准备事件?
编辑:注意:知道短读意味着失去读准备允许我(在一般情况下)避免冗余调用read()
只是为了获得EAGAIN
/EWOULDBLOCK
失败。
Linux epoll 上下文中短读/写的含义来自epoll
(7) 手册页中的此注释:
对于面向流的文件(如管道、FIFO、流套接字),也可以通过检查目标文件描述符读/写的数据量来检测读/写I/O空间耗尽的情况。例如,如果您通过请求读取一定数量的数据来调用 read(2),而 read(2) 返回的字节数较少,则可以确定文件描述符的读取 I/O 空间已用尽。使用 write(2) 写入时也是如此。(如果你不能保证被监控的文件描述符总是指向一个面向流的文件,请避免使用后一种技术。)