Linux epoll_wait()无限返回EINTR

Linux epoll_wait()无限返回EINTR,linux,multithreading,sockets,epoll,eintr,Linux,Multithreading,Sockets,Epoll,Eintr,我有一个线程负责轮询各种FD。我正在使用设置了超时的epoll\u wait。 以下是代码片段: do { n = epoll_wait(epollFd, eventsList, eventsTotal, timeoutMS); } while ((n<0) && (errno == EINTR)); 然后我使用gcore并尝试获取epoll_wait()返回的errno。它是4(EINTR)如果您至少向我们展示一段strace输出,会更有帮助。至少,它会告诉我

我有一个线程负责轮询各种FD。我正在使用设置了超时的epoll\u wait。 以下是代码片段:

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

然后我使用gcore并尝试获取epoll_wait()返回的errno。它是4(EINTR)

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

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

首先,看看strace输出。它将告诉您进程接收到的信号

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


使用此格式,您的信号处理程序将接收有关发送该信号的人的信息。这包括发送器的PID(如果是计时器)、计时器ID等。使用该信息确定信号来自何处。

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

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

首先,看看strace输出。它将告诉您进程接收到的信号

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


使用此格式,您的信号处理程序将接收有关发送该信号的人的信息。这包括发送器的PID(如果是计时器)、计时器ID等。使用该信息确定信号来自何处。

EINTR
通常意味着信号中断了
epoll
系统调用。尝试找出正在发送的信号,然后您可以找出原因以及如何解决问题。您可以将strace的输出张贴到您看到这种行为的位置吗?
EINTR
通常意味着信号中断了
epoll
系统调用。试着找出发送的是哪个信号,然后你就可以找出原因以及如何解决这个问题。你能把strace的输出贴在你看到这个行为的地方吗?
epoll_wait(8, {}, 8192, 10)             = 0
epoll_wait(8, {}, 8192, 10)             = 0
epoll_wait(8, {}, 8192, 10)             = 0
epoll_wait(8, {}, 8192, 10)             = 0