epoll的EPOLLOUT事件
文档上说epoll监听的描述符可写的时候会触发EPOLLOUT事件,
可是我想知道在接受到EPOLLOUT后,调用write还有限制吗,比如write过大的数据会不会还是返回EAGAIN。
想像这样的场景
- 服务器收到客户端的请求,要获取一张图片。
- 服务器读取该图片,保存为字节数组(**char***)
- 然后调用write欲将数据写入套接字,却返回EAGAIN
epoll_ctl为套接字添加EPOLLOUT的事件监听
那么问题来了,当**EPOLLOUT**事件发生时,往该套接字写该图片的数据,是否能成功
服务器使用C语言开发。不过我想其他语言的epoll都是从C语言绑定过去的,原理应该一样。
这里有点要注意的是,第一次write失败是因为数据量太大,如果write数据少一点是可以成功的。(至少从经验看是如此)那么当EPOLLOUT触发时能保证write一张大图片的数据会成功吗。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
socket没关闭,随时可以往里面写数据吧,写如果打会分片传输给client的。
@我是宅男小何 刚好提醒了我,其实就算整块数据很大,也不一定要调用一次write就全部写入。
上面代码,将超过4096的数据分片发送,如果阻塞,则返回等待下一次调用。
这段代码还没有测试过,基本这个逻辑
你说的返回EAGAIN是在非阻塞环境下,尝试用阻塞的操作不断去写就会返回这种errno。所以在触发EPOLLOUT的情况下是不会出现这种错误的。但是我写代码是一般都会检查EAGAIN还有EWOULDBLOCK这两种错误,然后忽略掉。
在epoll的ET模式下,正确的读写方式为:
读:只要可读,就一直读,直到返回0,或者 errno = EAGAIN
写:只要可写,就一直写,直到数据发送完,或者 errno = EAGAIN 下次再写