【问题标题】:Is there a Windows equivalent for eventfd?eventfd 是否有 Windows 等效项?
【发布时间】:2012-12-19 17:02:29
【问题描述】:

我正在编写一个模拟套接字行为的跨平台库,在两者之间(App->mylib->sockets)具有附加功能。

我希望它对程序员来说尽可能透明,所以像 select 和 poll 这样的原语必须与这个库相应地工作

问题是当数据在真实套接字中变得可用时(例如),它必须经过大量处理,所以如果选择指向真实套接字fd,应用程序将被阻塞很多时间。我希望仅在准备好使用数据时(在我的库完成所有处理之后)解除阻塞。

所以我遇到了这个eventfd,它允许我做我想做的事,即操纵给定fd上的选择/轮询行为

由于我对 Linux 环境比较熟悉,所以我不知道 windows 相当于 eventfd 是什么。尝试搜索但没有成功。

注意: 其他方法是使用与接口连接的另一个套接字,但这似乎开销很大。仅仅因为 windows 没有(看起来如此)这个功能而对所有数据进行系统调用。

或者我可以实现自己的选择,重新发明轮子。 =/

【问题讨论】:

  • Windows 只在 WinSock 中提供select,这意味着它只在网络套接字上运行,而不是文件描述符。

标签: c windows events cross-platform select-function


【解决方案1】:

没有。 eventfd 是 Linux 特有的功能——它甚至在其他 UNIXy 操作系统上都不可用,例如 BSD 和 Mac OS X。

【讨论】:

    【解决方案2】:

    是的,但这很荒谬。您可以制作一个分层服务提供者(全局安装......)来摆弄系统的网络堆栈。您可以自己实现所有 WinSock2 函数,并将其中大部分转发到底层 TCP。这通常被防火墙或防病毒程序用来将自己插入堆栈并查看发生了什么。

    在您的情况下,您希望使用 ioctl 为您的应用程序启用“特殊”行为。每当应用程序尝试创建一个套接字时,它都会被转发到您的函数,该函数又会打开一个真正的 TCP 套接字(比如说)。但是,您没有返回该 HANDLE,而是使用 WinSock 函数从内核创建请求一个虚拟句柄,并将其提供给应用程序。你在一个线程中做你的事情。然后,当应用程序在虚拟句柄上调用 WinSock 函数时,它们最终会出现在您的读取、选择等的实现中。您可以将虚拟句柄上的选择通知与实际句柄上的通知分离。这让您可以做一些事情,例如,透明地为应用程序提供一个套接字,该套接字以加密的方式以各种方式包装数据,与原始套接字没有区别。 (几乎无法区分!您可以在句柄上调用一些 LSP API,以查明是否有实际和底层句柄没有给您。)

    相当重量级,在某些方面很可怕。但是,它就在那里......希望这是一个有用的概述。

    【讨论】:

    • 谢谢!这似乎是 Windows 的完美选择,但恐怕用这种方法我几乎不得不为每个系统有一个完全不同的实现(如果我错了,请纠正我)。我想现在我会坚持使用 AF_UNIX 套接字(如果可用)和 localhost 上的 TCP 套接字用于其他系统(例如 win)。
    • 不错的选择。尽可能远离 Windows 的废话。我认为您的解决方案本质上是最佳的,因为如果您坚持它与 select 之类的系统调用一起使用,您的 lib 必须交出一个实际的 fd/socket。
    猜你喜欢
    • 2019-12-11
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2013-09-29
    相关资源
    最近更新 更多