- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我有一些看起来像这样的代码:
for (;;) {
errno=0;
epoll_event e = {};
auto wait_r = epoll_wait(g.epoll_fd, &e, 1, 0);
if (wait_r==0) break;
if(wait_r ==-1 && errno==EINTR) {
printf("got EINTR\n");
continue;
}
assert(wait_r == 1);
auto& c = *(Context*)e.data.ptr;
if(e.events & EPOLLERR ) {
int error = 0;
socklen_t errlen = sizeof(error);
auto r1 =getsockopt(c.socket, SOL_SOCKET, SO_ERROR, (void *)&error, &errlen);
assert(r1==0);
printf("Got EPOLLERR 2 %s\n", strerror(error));
}
if(e.events & EPOLLRDHUP || e.events & EPOLLHUP ) {
if (e.events & EPOLLRDHUP) {
printf("got to EPOLLRDHUP\n");
}
if (e.events & EPOLLHUP) {
printf("got to EPOLLHUP\n");
}
//continue; // keeps hitting this for same connections
break;
}
if (e.events & EPOLLIN) {
// Does a bunch of reads...
}
}
}
单个套接字将卡在 EPOLLRDHUP || 中EPOLLHUP
案例。套接字可能已关闭,当我尝试关闭它或执行 EPOLL_CTL_DEL 时,我得到一个 EBADFD。我的理解是 epoll 会自动清除所有死套接字,但情况似乎并非如此……有什么想法吗?
另一个可能的问题是,在套接字上,我正在使用 recvmsg/sendmsg,并且我在进程之间通过这些套接字发送文件描述符,这些套接字是 unix 域流套接字。我试图对其进行最终的 recvmsg,但也失败了……有什么想法吗?
最佳答案
对于我的问题,解决方案是像这样更改一行:
c.socket = accept(g.server_socket, NULL, NULL);
为此:
c.socket = accept4(g.server_socket, NULL, NULL, SOCK_CLOEXEC);
如果其他人遇到此问题,请注意 dup()
和 exec()
调用。 dup()
可能导致 epoll
表现得好像它没有关闭,即使您已经关闭了添加到 epoll
的 fd。 epoll
只有在 fd 的所有副本都关闭后才会识别它已关闭。 exec()
本质上会为每个不是使用 SOCK_CLOEXEC
标志创建的 fd 执行与 dup()
相同的操作...
关于linux - epoll_wait 似乎卡在了 EPOLLRDHUP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46732784/
我正在使用 epoll_wait 在客户端-服务器 TCP 连接上使用非阻塞读/写。 问题是,我无法使用 EPOLLRDHUP 标志可靠地检测“peer closed connection”事件。经常
所以我有一些看起来像这样的代码: for (;;) { errno=0; epoll_event e = {}; auto wait_r = epoll
我正在尝试在 Linux 中使用 epoll() 创建一个异步 Web 服务器,但是每当事件 EPOLLRDHUP 发生时就会出现问题。当标志 EPOLLONESHOT 未设置时,服务器会在循环期间多
摘自epoll_ctl的手册: EPOLLRDHUP (since Linux 2.6.17) Stream socket peer closed connection, or shut down w
我是一名优秀的程序员,十分优秀!