首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >epoll_wait()无限地返回EINTR

epoll_wait()无限地返回EINTR
EN

Stack Overflow用户
提问于 2017-09-30 11:03:41
回答 1查看 1.3K关注 0票数 2

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

代码语言:javascript
复制
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输出:

代码语言:javascript
复制
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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-30 17:15:01

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

没有这些信息,我就不能告诉你你的程序出了什么问题。不过,我可以告诉你怎么找出答案。

首先,查看strace输出。它会告诉你这个过程接收到了什么信号。

然后看看那个信号的信号处理器。如果你没有,注册一个。确保您使用的是sigaction而不是signal。另外,确保您使用的是较新的sa_sigaction函数格式。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46502099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档