我正在用Android ndk编写网络通信程序,使用epoll。 我发现'epoll_wait'方法不太准确
while(1){
struct epoll_event events[3];
log_string("epoll_wait start");//here will print start time
events_len = epoll_wait(_epoll_fd, events, 3, 20 * 1000);// wait 20 second,for test,I use pipe instead of socket,monitor a pipe EPOLLIN event
if (events_len <= 0) {
log_string("epoll_wait end events_len=%d,errno=%d", events_len, errno);//Normally,the events_len always is 0,and errno is 0
}
}
上面的代码在PC上运行(如Ubuntun PC)非常正常,正如预期的那样。
如果它在Android手机上运行(使用Android服务,运行单独的线程)首先是预期的。
一段时间后,epoll_wait变得不太准确,有时得-1和errno = 4,有时等待很长时间。
所以我只知道这种现象,但不知道为什么。
你能说出原因并告诉我使用android epoll的最佳做法吗? THX
答案 0 :(得分:1)
4是EINTR,这意味着你的应用得到了一个信号。这不是一个真正的错误,只需重启epoll。
关于“等待很长时间”,你的应用程序是否至少持有部分唤醒锁?