c – Kqueue(边缘触发):短读是否意味着读取准备就失去了?

c – Kqueue(边缘触发):短读是否意味着读取准备就失去了?,第1张

概述在边缘触发模式(EPOLLET)中使用 Linux epoll,并且EAGAIN / EWOULDBLOCK读/写失败时,意味着读/写就绪丢失,并且保证通过epoll_wait提供新的就绪事件(一旦恢复准备就绪. 此外,在边缘触发模式下使用Linux epoll和非阻塞流模式套接字时,如果我们注册了对EPOLLRDHUP事件的兴趣,并且尚未收到EPOLLRDHUP事件,则会进行短读/写(返回值小于 @H_403_2@ 在边缘触发模式(EPolLET)中使用 Linux epoll,并且EAGAIN / EWOulDBLOCK读/写失败时,意味着读/写就绪丢失,并且保证通过epoll_wait提供新的就绪事件(一旦恢复准备就绪.

此外,在边缘触发模式下使用linux epoll和非阻塞流模式套接字时,如果我们注册了对EPolLRDHUP事件的兴趣,并且尚未收到EPolLRDHUP事件,则会进行短读/写(返回值小于请求的大小)也意味着读/写就绪的丢失,并且当重新获得准备就绪时我们仍然可以依赖新的准备就绪通知,即使EAGAIN / EWOulDBLOCK没有读/写失败.

类似地,当在边缘触发模式(EV_CLEAR)中使用Kqueue(macOS / FreeBSD),并且使用EAGAIN / EWOulDBLOCK读/写失败时,这意味着读/写就绪丢失,并且保证新的就绪事件一旦恢复准备就可以通过kevent()获得.

问题:在边缘触发模式下使用Kqueue和非阻塞流模式套接字时,如果我们注册了对EV_EOF事件的兴趣,并且尚未收到EV_EOF事件,是否有类似的保证,即短读/ write意味着读/写就绪的丢失,并且在重新获得准备就绪时保证会产生新的准备事件?

编辑:注意:知道短读取意味着读取就绪性的丢失允许我(在一般情况下)避免冗余调用read()只是为了获得EAGAIN / EWOulDBLOCK失败.

linux epoll上下文中的简短读/写的含义,请参见epoll(7)手册页中的注释:

For stream-orIEnted files (e.g.,pipe,FIFO,stream socket),the condition that the read/write I/O space is exhausted can also be detected by checking the amount of data read from / written to the target file descriptor. For example,if you call read(2) by asking to read a certain amount of data and read(2) returns a lower number of bytes,you can be sure of having exhausted the read I/O space for the file descriptor. The same is true when writing using write(2). (AvoID this latter technique if you cannot guarantee that the monitored file descriptor always refers to a stream-orIEnted file.)

解决方法 您询问“边缘触发模式下的Kqueue”,但kqueue文档不使用该术语.我认为你必须意味着你已经为相关事件启用了EV_CLEAR标志,效果如此

After the event is retrIEved by the user,its state is reset.

(BSD documentation for kqueue())

此外,您规定该程序具有

registered interest in EV_EOF events,and that an EV_EOF event was not already received

但EV_EOF本身并不是一个事件;相反,它是一个标志,一些可用的过滤器将在适当时设置,尤其是EVFILT_READ.

无论如何,你问题的核心是

is there a similar guarantee,that a short read/write means loss of read/write-readiness,and that a new readiness event is guaranteed to be produced when readiness is regained?

据我所知,无法保证短读取信号会导致读取准备就绪,无论是BSD还是linux.实际上,用于读取(2)的linux文档特别指出接收信号是短读取的可能替代原因.

此外,linux epoll()文档推荐用于边缘触发模式下的非阻塞文件描述符的使用模型是重复读取,直到读取因EAGAIN而失败,使用它作为文件结束前失去准备状态的指示.对于EV_CLEAR生效的事件,我建议对kqueue系统遵循相同的策略.

我认识到你希望通过停止一次简短的读取来保存一个read()调用,但我认为这给了一个真正的风险,这个过程最少留下无法保留的传入数据流.此外,除非您确定这些额外的读取是造成可衡量的,不可接受的性能损失的原因,否则您的担忧还为时过早.

@H_403_2@ 总结

以上是内存溢出为你收集整理的c – Kqueue(边缘触发):短读是否意味着读取准备就失去了?全部内容,希望文章能够帮你解决c – Kqueue(边缘触发):短读是否意味着读取准备就失去了?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1224878.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存