【发布时间】:2018-02-08 22:49:23
【问题描述】:
我正在为 Linux 开发一个 kevent/kqueue emulation 库。我是这个项目的新维护者,不幸的是,以前的维护者不再参与太多(所以我无法动脑筋)。
在 FreeBSD 和 macOS 下,当你 close()kqeueue() 提供的文件描述符时,你释放了与之相关的所有资源和事件。
现有代码似乎没有提供类似的接口。在我向 API 添加一个函数(或恢复一个旧函数)以显式释放 kqueue 资源之前,我想知道是否有任何方法可以将触发器与 linux 中的文件描述符相关联,这样当它关闭时,我们可以清理与FD。
文件描述符本身可以是任何类型,即由 eventfd 提供的类型,或 epoll 或任何其他创建文件描述符的类型。
【问题讨论】:
-
观看 /proc/self/fd/N?你仍然需要监听 那个 描述符上的事件,但我猜你已经有一个
epoll()或某处的东西......是的,超级hackish。 -
我猜如果 libkqueue 创建了自己的监视线程来进行监视...
-
我不熟悉 kqueue API,但你的包装器中的一部分不会调用 epoll 吗?如果是这样,只需将 inotify fd 添加到描述符列表中即可轮询并通过调用回调来处理包装器中消失的文件。
-
但是必须调用 epoll 才能注册 kqueue FD 已关闭的事实,所以当您在最后的 kqueue fd 上
close()时,没有任何东西可以在任何地方注册该事实...因为不再调用 libkqueue API。我们不能把这个负担放在应用程序上,而且 libkqueue 中没有全局事件循环,这就是我说的原因,是的,但我们需要一个单独的线程。 -
如果您可以访问
fd作为驱动程序,那么内核会将close函数(连同write和read)映射到驱动程序的close函数.