Linux网络编程 epoll中EPOLLIN EPOLLOUT信号无法触发

比如
if(events[i].events&EPOLLIN)
{
int bytes_read=read(m_sockfd,read_buf,READ_BUFFER_SIZE);
}
这样会触发EPOLLIN
但如果把read()封装到比如service类的sread()函数中
if(events[i].events&EPOLLIN)
{
service.sread()
}
便不会触发EPOLLIN事件
请问问题出在哪 我使用同一个测试程序 第一种写法就可以触发第二种就不行

2个回答

c5395348
c5395348 这个我看过了 这里我说的区别是读和写函数从直接在主函数实现可以触发 但放在类里面实现就不能触发 我想不通这里的问题出在哪
接近 5 年之前 回复

第一,模式是什么?第二,你注册监听了什么事件?第三,accept的读事件触发,跟clientfd的读事件触发分清楚了吗?第四,经我自己实验,ET模式下,服务端注册clientfd的读写事件,当读事件触发时,写事件的flag位也是1,所以,理解epoll_wait的返回,返回的是个fd的状态,返回当时是处于readable与writable的状态,而不要把他理解为所谓的事件触发。另LT模式下,不要注册clientfd的写,因为,一般demo,写不满缓冲区的,那就一直处于writable状态,那epoll_wait会一直返回,要是打印控制台日志,会狂输出的~~要注意是状态,而不是所谓的事件。状态切换通知一次,就是ET,同一状态下的不断的通知,就是LT。
还有,建议你去了解一下epoll的回射模型,加深一下对epoll的理解~

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问