如果我是监听套接字上的epoll_wait(),并且当epoll_wait()返回指示它有活动时(在这种情况下,等待接受()ed的连接),那么如果accept()调用失败, errno = EINTR,epoll_wait()是否表示下次返回时同一连接正在等待侦听套接字?
即,我是否需要按照以下方式做点什么:
while(1){
epoll_wait(epfd, &events, maxevents, timeout);
if (events.data.fd == listener){
connsock = accept(listener, &addr, &addrlen);
while (connsock != -1){
if (errno == EINTR){
accept(listener, &addr, &addrlen);
}
}
}
}
为了确保连接被接受,或者这将工作并仍然确保接受的信号中断了accept()的连接:
while(1){
epoll_wait(epfd, &events, maxevents, timeout);
if (events.data.fd == listener){
connsock = accept(listener, &addr, &addrlen);
}
}
在这种情况下,如果accept()被一个信号中断,那么在epoll_wait再次返回之后,它将在下一次通过循环时获取相同的连接。
显然,在这两个示例中,我都做了一些假设(例如,在给定的epoll_wait调用中只返回一个套接字上的一个事件)并且不进行错误检查(除了在accept()上的EINTR,因为简化事情就是这里的重点
答案 0 :(得分:2)
这是边沿触发和电平触发之间的区别。使用级别触发,默认情况下,您不必担心它。
与级别触发的权衡是,当另一个线程返回调用epoll_wait
时,您不能让一个线程处理检测到的事件 - 它只会再次检测到同一事件。但在大多数情况下,你无论如何都不需要这样做,并且不可能失去一个事件的权衡是值得的。