在Channel::handleEventWithGuard()中,处理各种事件类型:
void Channel::handleEventWithGuard(Timestamp receiveTime)
{
eventHandling_ = true;
LOG_TRACE << reventsToString();
if ((revents_ & POLLHUP) && !(revents_ & POLLIN))
{
if (logHup_)
{
LOG_WARN << "fd = " << fd_ << " Channel::handle_event() POLLHUP";
}
if (closeCallback_) closeCallback_();
}
if (revents_ & POLLNVAL)
{
LOG_WARN << "fd = " << fd_ << " Channel::handle_event() POLLNVAL";
}
if (revents_ & (POLLERR | POLLNVAL))
{
if (errorCallback_) errorCallback_();
}
if (revents_ & (POLLIN | POLLPRI | POLLRDHUP))
{
if (readCallback_) readCallback_(receiveTime);
}
if (revents_ & POLLOUT)
{
if (writeCallback_) writeCallback_();
}
eventHandling_ = false;
}
POLLOUT:普通数据可写
POLLIN:可读取非高优先级的数据
POLLPRI:可读取高优先级数据
POLLRDHUP:对端套接字关闭
POLLERR:有错误发生
POLLNVAL:文件描述符未打开
POLLHUP:发生挂起,注意在判断该类型时,还判断了POLLIN没有发生,因为这两个如果同时发生,有可能是因为还有数据需要读,可能发生在管道的写端是关闭状态,但是管道里有数据,这时候会出现POLLIN和POLLHUP都存在。A POLLHUP means the socket is no longer connected. In TCP, this means FIN has been received and sent.