我想在用户空间中实现一个类似套接字的对象。有一个重要的要求是它应该是可轮询的(即它的状态应该可以通过 select 或 poll 调用进行查询)。
是否有实现此类对象的平台中立方式?
我知道在 Linux 上有 eventfd 可以满足需求,除了没有办法强制它既不表示 POLLIN 也不表示 POLLOUT。
我想在用户空间中实现一个类似套接字的对象。有一个重要的要求是它应该是可轮询的(即它的状态应该可以通过 select 或 poll 调用进行查询)。
是否有实现此类对象的平台中立方式?
我知道在 Linux 上有 eventfd 可以满足需求,除了没有办法强制它既不表示 POLLIN 也不表示 POLLOUT。
您可以使用 socketpair() 创建一对连接的 AF_UNIX 套接字。这比 pipe() 更好,因为它允许双向通信。如果这还不足以满足您的需求,另一种选择(需要 root 用于守护进程)将使用 as-yet-not-in-mainline-Linux CUSE补丁在用户空间中创建设备驱动程序来执行您的任何操作喜欢。或者您可以直接连接到您的用户将使用的任何事件循环...
新的 linux eventfd 也可以模拟 POLLIN/POLLOUT,尽管不能同时模拟两者 - 将其值设置为 0xffffffffffffffff 用于 POLLIN 但不是 POLLOUT,0 用于 POLLOUT 但不是 POLLIN,或者两者都设置为其他任何值。
除了这些选项之外,没有平台中立的方法可以做到这一点,不。通常的模式是使用 FIFO 来唤醒事件循环,并在唤醒后使用其他 API 进行轮询。
真的不清楚您要做什么。如果你想要一个类似套接字的设备,为什么不使用套接字呢?你不会说...... POLLIN 和 POLLOUT 是怎么回事?
我有点怀疑您可能对使用伪终端设备感兴趣,请参阅 man 7 pty。
使用管道()。它给你两个 fd,一个写,一个读。使用 fd[1] 进行选择/投票。
使用 fd[0] 表示您的选择/投票活动。