我有一个线程负责轮询各种fds。我使用的是带有超时设置的epoll_wait。下面是代码片段:
do {
n = epoll_wait(epollFd, eventsList, eventsTotal, timeoutMS);
}
while ((n<0) && (errno == EINTR));eventsList内存包含timerfd、signalfd和socket fd。
线程运行良好&处理定时器事件、套接字打开/读/写/关闭事件和用户定义的信号事件。
但是,有时线程以errno的形式进入无限do-while循环时,总是返回EINTR。
线程的Top -H显示状态为睡眠。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)
发布于 2017-09-30 17:15:01
如果您至少向我们展示strace输出的一个片段,则会更有帮助。至少,它会告诉我们正在接收哪个中断。
没有这些信息,我就不能告诉你你的程序出了什么问题。不过,我可以告诉你怎么找出答案。
首先,查看strace输出。它会告诉你这个过程接收到了什么信号。
然后看看那个信号的信号处理器。如果你没有,注册一个。确保您使用的是sigaction而不是signal。另外,确保您使用的是较新的sa_sigaction函数格式。
使用这种格式,您的信号处理程序将接收有关发送该信号的人的信息。这包括发送者的PID,如果是定时器,计时器ID等等。使用这些信息来确定信号来自哪里。
https://stackoverflow.com/questions/46502099
复制相似问题