草庐IT

EPOLLHUP

全部标签

linux - 如何处理EPOLLERR和EPOLLHUP?

我看了libeventepoll中的代码,这里是代码:if(what&(EPOLLHUP|EPOLLERR)){ev=EV_READ|EV_WRITE;}else{if(what&EPOLLIN)ev|=EV_READ;if(what&EPOLLOUT)ev|=EV_WRITE;if(what&EPOLLRDHUP)ev|=EV_CLOSED;}据我了解,当EPOLLERR或EPOLLHUP发生时,应该关闭连接。但是在上面的代码中,遇到EPOLLHUP|EPOLLERR时,事件掩码设置为EV_READ|EV_WRITE。所以我的问题是:是什么让EPOLLERR和EPOLLHUP发生的?

linux - 如何处理EPOLLERR和EPOLLHUP?

我看了libeventepoll中的代码,这里是代码:if(what&(EPOLLHUP|EPOLLERR)){ev=EV_READ|EV_WRITE;}else{if(what&EPOLLIN)ev|=EV_READ;if(what&EPOLLOUT)ev|=EV_WRITE;if(what&EPOLLRDHUP)ev|=EV_CLOSED;}据我了解,当EPOLLERR或EPOLLHUP发生时,应该关闭连接。但是在上面的代码中,遇到EPOLLHUP|EPOLLERR时,事件掩码设置为EV_READ|EV_WRITE。所以我的问题是:是什么让EPOLLERR和EPOLLHUP发生的?

c - EPOLLERR 和 EPOLLHUP 的真正含义是什么以及如何处理它们?

我正在阅读redis源代码,在ae_epoll.c中我发现了以下代码:staticintaeApiPoll(aeEventLoop*eventLoop,structtimeval*tvp){aeApiState*state=eventLoop->apidata;intretval,numevents=0;retval=epoll_wait(state->epfd,state->events,eventLoop->setsize,tvp?(tvp->tv_sec*1000+tvp->tv_usec/1000):-1);if(retval>0){intj;numevents=retval;

linux - TCP:EPOLLHUP 是什么时候产生的?

另见thisquestion,截至目前尚未答复。关于EPOLLHUP存在很多混淆,甚至在man和内核文档中也是如此。人们似乎相信它在轮询描述​​符时返回本地关闭写入,即shutdown(SHUT_WR),即导致EPOLLRDHUP在同行。但这不是真的,在我的实验中,在shutdown(SHUT_WR)之后,我得到了EPOLLOUT,没有EPOLLHUP(是的,这是违反直觉的可写,因为写的那一半是封闭的,但这不是问题的重点)。man很差,因为它说EPOLLHUP当挂断发生在关联的文件描述符上时,没有说明“挂断”是什么意思——对方做了什么?发送了什么数据包?Thisotherarticle