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

时间:2009-05-26 06:30:29

标签: linux file-descriptor

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

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

我知道在Linux上有eventfd哪种适合需要,除了没有办法强迫它既没有发出POLLIN信号也没有POLLOUT。

4 个答案:

答案 0 :(得分:2)

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

新的linux eventfd也可以模拟POLLIN / POLLOUT,虽然不能同时使用它们 - 将其值设置为POLLIN的0xffffffffffffffff而不是POLLOUT,将POLLOUT的值设置为0而不是POLLIN,或两者的其他任何内容。

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

答案 1 :(得分:1)

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

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

eventfd不是你要求的,它是在内核空间中实现的。你有没有描述过你真正的问题? fifounix domain socket可以满足您的需求吗?

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

答案 2 :(得分:0)

你真的不清楚你要做什么;如果你想要一个类似套接字的设备,为什么不使用套接字呢?你不说......和POLLIN和POLLOUT的交易是什么?

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

答案 3 :(得分:0)

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