从用户空间模拟字符设备

fre*_*hat 3 c drivers kernel devices

我们目前正在致力于构建一个针对不同传感器的数据可视化系统。

为了使 Linux 应用程序的开发成为可能,我们需要模拟不同字符设备的行为,因为设备驱动程序和硬件设计尚未完成。

那么有没有一种方法可以接收对某个特定文件的系统调用(例如,也从用户空间运行的 C 程序)?

                                   read()
(Userspace Application/Database) <========= (~/mydev) <===== (dummy_driver)
Run Code Online (Sandbox Code Playgroud)

meu*_*euh 8

您可以在用户空间中使用cuse 字符设备,它是熔丝库的一部分,在大多数系统中作为包提供。“驱动程序”的一个示例是cuse.c。当您编译并运行此示例时:

sudo ./cuse -f --name=mydevice
Run Code Online (Sandbox Code Playgroud)

它创建/dev/mydevice并接收所有对其的 open、close、read、write、ioctl 调用。要“卸载”设备(用保险丝术语),只需终止该进程即可。

该示例可能未分发,因此要编译,下载(或 git clone) zip 更改到libfuse/example目录,然后编译,如 C 文件所示:

gcc -Wall cuse.c $(pkg-config fuse --cflags --libs) -o cuse -I.
Run Code Online (Sandbox Code Playgroud)

您可能需要安装一个fuse-devel软件包或类似的软件包才能正常工作。如果您需要实现更多 ioctl,请查看作为对此stackexchange问题的答案的评论给出的链接

可以考虑的更简单的替代方案是伪 tty ptytty0tty,它是一个将两个串行端口连接在一起的内核模块。