epoll_wait()无限地返回EINTR

时间:2017-09-30 11:03:41

标签: linux multithreading sockets epoll eintr

我有一个负责轮询各种fds的线程。我正在使用带有超时设置的epoll_wait。 以下是代码段:

do {
    n = epoll_wait(epollFd, eventsList, eventsTotal, timeoutMS);
} 
while ((n<0) && (errno == EINTR));

eventsList内存包含timerfd,signalfd和socket fd。

线程运作良好&amp;处理定时器事件,套接字打开/读/写/关闭事件&amp;用户定义的信号事件。

但是有时候线程进入无限的do-while循环,因为errno总是返回 EINTR
线程的 Top -H 显示状态为sleep。 strace 显示它在呼唤 循环中的epoll_wait()。

所以当我使用广为接受的处理方式时可能出现问题 epoll_wait&amp; EINTR?套接字读/写/关闭可能导致上述问题吗?还是用timerfd?

更新: strace -p输出:

epoll_wait(8, {}, 8192, 10)             = 0
epoll_wait(8, {}, 8192, 10)             = 0
epoll_wait(8, {}, 8192, 10)             = 0
epoll_wait(8, {}, 8192, 10)             = 0

然后我拿了gcore并尝试通过epoll_wait()返回errno。它是4(EINTR)

1 个答案:

答案 0 :(得分:0)

如果您向我们展示至少一段strace输出,那会更有帮助。它至少会告诉我们正在接收哪个中断。

如果没有这些信息,我无法告诉你程序有什么问题。但是,我可以告诉你如何找到答案。

首先,看一下strace输出。它会告诉您该过程收到的信号。

然后查看该信号的信号处理程序。如果你没有,请注册一个。确保您使用sigaction而不是signal来执行此操作。另外,请确保使用较新的sa_sigaction函数格式。

使用此格式,您的信号处理程序会收到有关谁发送该信号的信息。这包括发送方的PID,如果是定时器,定时器ID等。使用该信息来确定信号的来源。