在用户空间模拟文件描述符

发布于 2024-07-22 04:49:27 字数 190 浏览 11 评论 0原文

我想在用户空间中实现一个类似套接字的对象。 有一个重要的要求是它应该是可轮询的(即它的状态应该可以通过 select 或 poll 调用进行查询)。

是否有平台中立的方式来实现这样的对象?

我知道在 Linux 上有 eventfd 可以满足需要,只是没有办法强制它既不发出 POLLIN 也不发出 POLLOUT 信号。

I would like to implement a socket-like object in user space. There's an important requirement that it should be pollable (i.e. it's state should be queryable via select or poll call).

Is there a platform neutral way of implementing such an object?

I'm aware that on Linux there's eventfd which kind of suits the needs except that there's no way to force it to signalize neither POLLIN nor POLLOUT.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

铁轨上的流浪者 2024-07-29 04:49:27

您可以使用 socketpair() 创建一对连接的 AF_UNIX 套接字。 这比 pipeline() 更好,因为它允许双向通信。 如果这还不足以满足您的需求,另一个选择(需要 root 来运行守护程序)是使用 as-yet-not-in-mainline-Linux CUSE 补丁在用户空间中创建设备驱动程序以执行您喜欢的任何操作。 或者你可以挂钩到你的用户将使用的任何事件循环...

新的linux eventfd也可以模拟POLLIN/POLLOUT,尽管不能同时模拟两者 - 将其值设置为0xfffffffffffffffe用于POLLIN而不是POLLOUT,0用于POLLOUT但不是波林,或者其他任何东西。

除了这些选项之外,没有平台中立的方法可以做到这一点,不是。 通常的模式是使用 FIFO 来唤醒事件循环,并在唤醒后使用其他 API 进行轮询。

You can use socketpair() to create a pair of connected AF_UNIX sockets. This is better than pipe() as it allows for bidirectional communication. If this isn't good enough for your needs, another option (which requires root for a daemon) would be to use the as-yet-not-in-mainline-Linux CUSE patches to create a device driver in userspace to do whatever you like. Or you can just hook into whatever event loop your user will be using...

The new linux eventfd can also emulate POLLIN/POLLOUT, although not both at once - set its value to 0xfffffffffffffffe for POLLIN but not POLLOUT, 0 for POLLOUT but not POLLIN, or anything else for both.

Other than these options, there's no platform-neutral way to do this, no. The usual pattern is to use a FIFO just to wake up the event loop, and have it poll using some other API once it's awake.

乱了心跳 2024-07-29 04:49:27

您想构建一个可通过系统调用访问的用户空间对象吗?
即打开、读取、写入等...被重定向到您的用户空间对象?

您需要内核支持或 libc 支持,否则我不知道如何重定向系统调用。

eventfd 不是您所要求的,它是在内核空间中实现的。 您描述了您真正的问题吗? 可以 fifounix 域套接字 满足您的需要吗?

伪 tty 怎么样? 我不知道是否可以通过伪造硬件流控制来阻止主控端的写入。

You want to build an user space object, that will be accessible through system call ?
ie open, read, write etc ... are redirected to your userspace object ?

You need either kernel support or libc support, otherwise I don't see how you can redirect your system call.

eventfd is not what you are asking for, it is implemented in kernel space. Did you describe your real problem ? Could fifo or unix domain socket fit your need ?

What about pseudo tty ? I don't know if you can block writing from the master side by faking the hardware flow control.

时间你老了 2024-07-29 04:49:27

确实不清楚你想做什么; 如果你想要一个类似套接字的设备,为什么不使用套接字呢? 你不会说... POLLIN 和 POLLOUT 是怎么回事?

我有点怀疑您可能对使用伪终端设备感兴趣,请参阅 man 7 pty。

It's really not clear what you're trying to do; if you want a socket-like device, why not use sockets? You don't say ... And what's the deal with POLLIN and POLLOUT?

I kinda suspect you might be interested in using pseudo-terminal devices, see man 7 pty.

闻呓 2024-07-29 04:49:27

使用管道()。 它给你两个fd,一个用来写,一个用来读。
使用 fd[1] 进行选择/轮询。
使用 fd[0] 来表示您的选择/轮询活动。

Use pipe(). It gives you two fd's, one to write, one to read.
Use the fd[1] to do your select/poll on.
Use the fd[0] to signal your select/poll for activity.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文