繁体   English   中英

在信号和epoll_wait()上中断accept()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM