linux - epoll_wait() 无限返回 EINTR

标签 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。

该线程运行良好并处理定时器事件、套接字打开/读/写/关闭事件和用户定义的信号事件。

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

所以当我使用公认的处理方式时可能会出现什么问题 epoll_wait 和 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)

最佳答案

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

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

首先,查看 strace 输出。它会告诉您进程收到的是什么信号。

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

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

关于linux - epoll_wait() 无限返回 EINTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46502099/

相关文章:

linux - 为什么 Linux 版本号还没有超过 2.6?

c - 这个程序如何停止接受输入?

java.lang.NullPointerException 通过对象输出流发送消息时

c - 在 shm_unlink 之后访问内存

c# - task.delay 执行后是否有无限代码?

java - 'thread-safe' 在 Java 中的集合或数组的上下文中意味着什么?

python - python能够在多核上运行吗?

Java套接字编程-流被卡住

c++ - 优化 Linux 套接字

Linux - 如何从数组中找到短语