[英]accept() interrupted on a signal and epoll_wait()
如果我正在侦听套接字上使用epoll_wait(),并且当epoll_wait()返回指示它具有活动性(在这种情况下,连接等待被接受)时,如果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);
}
}
}
}
为了确保该连接被接受,或者将确保该连接正常工作,并且仍然确保接受被信号中断的连接:
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,因为它是整个过程)指向此处)以简化操作
这是边沿触发和电平触发之间的区别。 使用级别触发(默认设置),您不必担心。
使用级别触发的权衡是,您无法让一个线程处理检测到的事件,而另一个线程又返回调用epoll_wait
-它只会再次检测到同一事件。 但是在大多数情况下,无论如何您都不需要这样做,并且在不可能丢失事件的情况下进行权衡是值得的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.