2

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

是否有实现此类对象的平台中立方式?

我知道在 Linux 上有 eventfd 可以满足需求,除了没有办法强制它既不表示 POLLIN 也不表示 POLLOUT。

4

4 回答 4

2

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

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

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

于 2009-05-27T04:25:09.277 回答
1

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

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

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

伪 tty呢?我不知道你是否可以通过伪造硬件流控制来阻止从主端写入。

于 2009-05-26T08:58:06.503 回答
0

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

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

于 2009-05-26T09:36:16.893 回答
0

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

于 2009-05-27T04:19:51.717 回答