EPOLLRDHUP是从Linux内核2.6.17开始由GNU引入的事件。
对端正常关闭(程序里close(),shell下kill或ctr+c),触发EPOLLIN和EPOLLRDHUP,但是不触发EPOLLERR 和EPOLLHUP。 再man epoll_ctl看下后两个事件的说明,这两个应该是本端(server端)出错才触发的。
EPOLLRDHUP 这个好像有些系统检测不到,可以使用EPOLLIN,read返回0,删除掉事件,关闭close(fd);
如果有EPOLLRDHUP,检测它就可以直到是对方关闭;否则就用上面方法。
EPOLLHUP 表示读写都关闭。本端调用shutdown(SHUT_RDWR)。 不能是close,close 之后,文件描述符已经失效。这个应该是本端(server端)出错才触发的。
监听的skocket只需要EPOLLIN就足够了,EpollErr和EpollHup会自动加上。
监听的socket又不会写,一个EpollIn足矣。
5、对端异常断开连接(只测了拔网线),没触发任何事件。
附man:
EPOLLIN 连接到达;有数据来临;
The associated file is available for read(2) operations.
EPOLLOUT 有数据要写
The associated file is available for write(2) operatio