问题标签 [epollet]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - epoll 事件不会引发 SIGIO
根据我的研究,您可以将 epoll 文件描述符添加到 poll、select 或另一个 epoll 中,如果事件可用,它将返回 POLLIN。根据 epoll(7):
这在我的测试中有效。但是,我现在正尝试将 O_ASYNC 应用于我的 epoll fd,以便在事件准备好时引发 SIGIO:
当我这样做时,它不会为 epoll 中的新事件引发 SIGIO。poll 表示 epollFd 中有准备好的事件,但它应该首先引发 SIGIO(它只是检查事件是否在 epollFd 中并退出)。我知道我可以将 O_ASYNC 应用于套接字(我也尝试过),但我希望在我的事件中包含数据。Epoll 让我这样做。
这是我的完整代码:
编辑:根据这个网站,我想做的应该是:
c++ - epoll_wait() 是否报告所有关闭套接字事件?
或者我是否也需要注意 read() 或 write() 的返回值以知道何时关闭套接字
或者它取决于某些标志?
这个问题是针对边缘触发模式下的 epoll
linux - 嵌套 EPOLL FD
我在网上找到的关于嵌套 FD 行为的信息非常有限。
假设 EPOLL FD1 在 EPOLL FD2 和 FD3 之间共享。那么如果 epoll FD1 得到一个事件会发生什么
- 如果在没有 epoll_exclusive 标志的情况下添加它,是否会同时向 FD2 和 Fd3 引发事件。
- 收到事件后,是否需要在 FD1 上执行 epoll_wait 以清除事件。
以及嵌套epoll FD的用例是什么。
linux - EPOLLET 行为不正确?
请考虑以下程序:
最后一个断言失败。
因为我们从来没有EPOLLET
从 epoll 中读取 an,所以我期待最后一个epoll_wait
返回 0。相反,我得到了 1。
这是为什么?
来自 Ubuntu 16.10 的内核 4.13.0-39-generic。
nonblocking - “特殊” epoll 标志如何对应 kqueue 标志?
我正在努力在 epoll 和 kqueue 标志之间画一个平行线,特别是EPOLLONESHOT EPOLLET EPOLLEXCLUSIVE
和 EV_CLEAR/EV_DISPATCH/EV_ONESHOT。我是第一次调查kqueue;我只有epoll的经验。
EV_DISPATCH
感觉就像 EPOLLEXCLUSIVE 和 EPOLLONESHOT 标志的混合;来自 kqueue 文档:
如果至少有一个 kqueue 实例轮询此事件,我是否正确理解该事件已发出信号然后立即丢弃的文档?也就是说,如果我们在两个 kqueue 上轮询 EVFILT_READ 的套接字,只有一个会接收到它,然后,直到使用 EVFILT_ENABLE 设置相同的事件,即使有新数据到达套接字,也不会再有任何进一步的事件?
EV_CLEAR
看起来离EPOLLET很近;来自 kqueue 文档:
因此,例如,给定带有 EVFILT_READ 的相同套接字,所有同时轮询它的 kqueue 都将使用 EVFILT_READ 唤醒。但是,如果不是所有数据都被读取(即直到 EAGAIN),则不会报告更多事件。当且仅当所有数据都被读取并且新数据到达时,才会触发新的 EVFILT_READ 事件。这是对的吗?
EV_ONESHOT
看起来它映射到 EPOLLONESHOT;来自 kqueue 文档:
问题
所以,问题:
- 我的理解正确吗?与 epoll 相比,我是否正确理解了这些特殊标志?文档对我来说似乎有点棘手;可能问题是我之前只用过epoll,还没有玩过kqueue。
- 您能否提供好的资源或示例来查看 kqueue 技术?如果它不像 Boost.Asio 那样复杂,那就太好了;这些源代码也可以用 C 语言编写。
- 这些标志可以组合在一起吗?例如,EPOLLONESHOT 不能与 EPOLLEXCLUSIVE 组合,但 EV_DISPATCH 似乎恰好位于这些标志之间。
谢谢您的帮助!
参考
linux - TCP:EPOLLHUP 何时生成?
另请参阅this question,截至目前尚未得到解答。
EPOLLHUP
即使在man
和 Kernel 文档中,也有很多混淆。人们似乎相信它是在对本地关闭写入的描述符进行轮询时返回的,即在对等方shutdown(SHUT_WR)
引起 an 的相同调用。但这不是真的,在我的实验中,我得到了,而不是,之后(是的,得到writable是违反直觉的,因为写作的一半已经结束,但这不是问题的重点)。EPOLLRDHUP
EPOLLOUT
EPOLLHUP
shutdown(SHUT_WR)
这个人很可怜,因为它说在关联文件描述符上发生挂断时就EPOLLHUP
来了,而没有说明“挂断”是什么意思——对等方做了什么?发送了哪些数据包?另一篇文章只是进一步混淆了事情,对我来说似乎完全错误。
我的实验表明EPOLLHUP
,一旦 EOF(FIN 数据包)双向交换,即双方发出shutdown(SHUT_WR)
. 它与 无关SHUT_RD
,我从不打电话。也无关close
。就数据包而言,我怀疑EPOLLHUP
主机发送的 FIN 的 ack 引发了这个问题,即终止发起者在 4 次关闭握手的第 3 步中引发了这个事件,而对等方在第 4 步引发了这个事件(见这里)。如果得到确认,那就太好了,因为它填补了我一直在寻找的空白,即如何在没有 LINGER 的情况下轮询非阻塞套接字以获取最终 ack。它是否正确?
(注意:我正在使用 ET,但我认为这与此无关)
示例代码和输出。
代码在一个框架中,我提取了它的核心,除了TcpSocket::createListener
和TcpSocket::connect
,TcpSocket::accept
它们可以满足您的期望(此处未显示)。
输出:
除了EPOLLHUP 是什么意思之外,没有更好的方法来改写这个问题?我认为文档很差,其他地方(例如这里和这里)的信息是错误的或无用的。
注意:要考虑回答的 Q,我想确认 EPOLLHUP 在两个方向的最终 FIN-ACK 上引发。
c - 是否可以使用 EPOLL 向多个客户端发送任务
我正在构建一个服务器/客户端应用程序。服务器将需要处理少于 1000 个以上的客户端。我目前有一个简单的 EPOLL 实现,能够从客户端接收信息到服务器。但是,我还需要能够向特定客户发送任务。我的问题是有一种方法可以使用 EPOLL 来识别我还需要哪些客户端发送任务(可能使用 EPOLLOUT 标志)并将消息发送出去。我附上了我目前拥有的片段。如果可能的话,我将如何实现这一点。如果可以这样工作,那么能够为所有发送和接收提供一个 epoll 会很棒。
感谢您的任何帮助/建议!
c++ - epoll 零 recv() 和负数 (EAGAIN) send()
前几天我在 epoll 上苦苦挣扎,现在我正处于茫茫人海中;)
互联网上有很多信息,显然在系统人中,但我可能服用过量并且有点困惑。
在我的服务器应用程序(nginx 的后端)中,我在 ET 模式下等待来自客户端的数据:
event_template.events = EPOLLIN | EPOLLRDHUP | EPOLLET
当我注意到 nginx 以 502 响应时,一切都变得好奇了,尽管我可以看到成功的 send() 在我身边。我运行wireshark 进行嗅探,并意识到我的服务器将(尝试并获取RST)数据发送到网络上的另一台机器。所以,我决定套接字描述符是无效的,这是一种“未定义的行为”。最后,我发现在第二个 recv() 上,我得到零字节,这意味着必须关闭连接,并且不允许我再发回数据。尽管如此,我从 epoll 中获得的不仅仅是 EPOLLIN,而是 EPOLLRDHUP。
问题:在 EPOLLRDHUP 处理期间,当 recv() 返回零和 shutdown(SHUT_WR) 时,我是否必须关闭套接字才能读取?
简而言之,从套接字读取:
可能,我的一般错误是尝试在无效的套接字描述符上发送数据,而后来发生的一切都只是一个结果。但是,我继续挖掘;)我的第二部分问题是关于在 MSG_DONTWAIT 模式下写入套接字。
据我现在所知,send() 也可能返回 -1 和 EAGAIN,这意味着我应该订阅 EPOLLOUT 并等待内核缓冲区足够空闲以接收我的一些数据。这是正确的吗?但是如果客户不会等那么久呢?或者,我可以调用阻塞发送(无论如何,我在不同的线程上发送)并保证我发送给内核的所有内容都会因为 setsockopt(SO_LINGER)而真正发送给对等方?我要求确认的最后一个猜测是:我被允许同时读取和写入,但 N>1 并发写入是数据竞争,我必须处理的所有事情都是互斥体。
感谢所有至少读到最后的人:)
epoll - 关于使用Epoll Edge Triggered时重新布防EPOLL的时机问题及相关问题
在使用边缘触发和 EPOLLONESHOT 时,我对 EPOLL 有一些疑问。
下面列出了简化的语句序列。实际上,多个文件由一个 Epoll Fd 监控,一组文件通过特定线程进行管理。使用的变量名不言自明,当然是设置好的。为简洁起见,省略了该部分:
}
问题:
使用 EPOLLONESHOT 时,应何时重新武装 EPOLL?收到事件后还是处理完事件后?
初级。在写入或读取时,我们会跟踪写入/读取的数据点,直到返回 EAGAIN 或部分读取/写入?是/否。
最初没有设置 EPOLLOUT。写入时,当write返回EAGAIN时,我们将EPOLLOUT添加到要监控的事件中。是/否?
当 FD 再次触发 EPOLLOUT 时,我们从上次收到 EAGAIN 的点继续写入,直到我们再次获得 EAGAIN。然后我们重新武装。是/否?
如果我们读取部分而不重新ARM,新数据将继续到达但不会触发任何事件。因此,如果我们读取部分内容,我们需要对其进行跟踪,而不是仅依赖事件处理程序进行读取处理。对?
sockets - 非阻塞套接字可以和epoll的电平触发模式一起使用吗?
目前我有一个支持多个客户端会话的服务器应用程序。服务器以 epoll 的边缘触发模式运行。服务器内部使用的套接字本质上都是非阻塞的。主 epoll 循环看起来像这样,
当数据连续流过缓冲区并且缓冲区永远不会耗尽时,就会出现问题。其他会话没有机会被服务器招待。由于这可能对其他客户端造成饥饿,我正在考虑使用级别触发模式,该模式允许服务器以循环方式招待所有活动会话。我可以通过从订阅的事件中删除“EPOLLET”并读取一次缓冲区数据(例如,在 LT 模式下)来使用级别触发模式吗?任何意见/参考表示赞赏。谢谢 !