我目前正在尝试创建一个内核模块,该模块将根据内核事件生成数据并将它们推送到文件中。在读到这很糟糕(并且我同意)之后,我认为将数据放在/ proc文件中会更有意义,用户程序可以在必要时从中获取数据。但是,这个想法导致了各种各样的问题,特别是何时以及如何清除这个文件。所以我想......“为什么我不在/ proc中创建命名管道并从中读取?”
我已经掌握了为proc文件设置读取函数和写入函数的一般要点,但是我仍然遇到了如何解决这个问题的概念性问题。也就是说,我如何编写这样一个函数来获取任意数据并将其从内核写入这样的管道?有没有人知道如何将数据从内核空间推送到命名管道?最后,它不会将作为/ proc文件(特别是如果我这样做是错的),但这是我得出的结论。然后我将不得不弄清楚如何从用户空间程序附加到它,但我觉得这是一个单独的问题。
答案 0 :(得分:5)
您要做的不是创建命名管道,而是创建“角色设备”。如果您想要从内核到用户空间和返回的简单交互或流数据,这是常用的方法。我建议在Linux内核中查找类似的设备并查看它们的用途。
答案 1 :(得分:3)
我认为通常这样做的方法是使用netlink套接字;一个或多个用户空间进程可以绑定到“netlink”地址,并且您的内核工具可以根据需要向任何/所有用户广播消息。
这当然是一些事情,尤其是网络子系统。用户空间程序可以使用该方法监视网络接口的变化(例如,新IP地址,链路状态变化)。
答案 2 :(得分:1)
我同意保罗 - 实施角色设备可能是最好的方法。也许看一下实现/ dev / kmem或/ dev / rtc [0-9]的代码。此外,串行驱动程序使用字符设备实现其驱动程序。
将其视为虚拟设备。 : - )
答案 3 :(得分:1)
/ proc isn't actually a real file system;它是由内核根据当前运行的内容构建的。我不认为你可以在其中创建命名管道。
答案 4 :(得分:0)
有一些好的建议。内核支持多种方式:
希望这会有所帮助。