我想在用户空间实现一个类似套接字的对象。有一个重要的要求是它应该是可轮询的(即它的状态应该可以通过 select 或 poll 调用进行查询)。
是否有平台中立的方法来实现这样的对象?
我知道在 Linux 上有 eventfd 可以满足需要,只是没有办法强制它既不发出 POLLIN 也不发出 POLLOUT 信号。
最佳答案
您可以使用socketpair() 创建一对连接的AF_UNIX 套接字。这比 pipeline() 更好,因为它允许双向通信。如果这还不足以满足您的需求,另一个选择(需要 root 来运行守护程序)是使用 as-yet-not-in-mainline-Linux CUSE修补程序以在用户空间中创 build 备驱动程序以执行您喜欢的任何操作。或者您可以直接连接到您的用户将使用的任何事件循环...
新的 Linux eventfd 还可以模拟 POLLIN/POLLOUT,尽管不能同时模拟两者 - 将其值设置为 0xfffffffffffffffe(对于 POLLIN 但不是 POLLOUT)、0 对于 POLLOUT 但不是 POLLIN,或者对于两者都设置为其他任何值。
除了这些选项之外,没有平台中立的方法可以做到这一点,不是。通常的模式是使用 FIFO 来唤醒事件循环,并在唤醒后使用其他 API 进行轮询。
关于linux - 在用户空间模拟文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/909189/