2

我目前正在尝试创建一个内核模块,该模块将根据内核事件生成数据并将它们推送到文件中。在读到这很糟糕(我同意)之后,我决定将数据放在 /proc 文件中,用户程序可以在必要时从中提取数据会更有意义。然而,这个想法导致了各种各样的问题,特别是何时以及如何清除这个文件。所以我想......“为什么我不在 /proc 中创建一个命名管道并从中读取呢?”

我已经掌握了为 proc 文件设置读取函数和写入函数的一般要点,但我仍然在如何处理这个问题上遇到概念上的问题。也就是说,我将如何编写这样一个函数来获取任意数据并将其从内核写入这样的管道?有谁知道如何将数据从内核空间推送到命名管道?最后,它不一定/proc 文件(特别是如果我这样做是错误的),但这是我得出的结论。然后我必须弄清楚如何从用户空间程序附加到它,但我觉得这是一个单独的问题。

4

5 回答 5

5

您要做的不是创建命名管道,而是创建一个“字符设备”。如果您想要从内核到用户空间并返回的简单交互或流式传输数据,这是通常的方法。我建议在 Linux 内核中查找类似的设备并查看它们的功能。

于 2008-11-24T03:33:31.637 回答
3

我认为通常这样做的方式是使用 netlink 套接字;一个或多个用户空间进程可以绑定到“netlink”地址,并且您的内核设施可以根据需要将消息广播到任何/所有这些进程。

这当然是某些事情所做的,尤其是网络子系统。用户空间程序可以使用这种方法观察网络接口的变化(例如新的 IP 地址、链接状态变化)。

于 2008-11-24T21:32:46.170 回答
1

我同意 Paul 的观点——实现字符设备可能是最好的方法。也许查看实现 /dev/kmem 或 /dev/rtc[0-9] 的代码。此外,串行驱动程序使用字符设备实现其驱动程序。

只需将其视为虚拟设备即可。:-)

于 2008-11-24T04:22:46.810 回答
1

/proc实际上不是真正的文件系统;它是由内核根据当前运行的内容构建的。我认为您不能在其中创建命名管道。

于 2008-11-24T04:32:20.457 回答
0

有一些很好的建议。内核支持多种方式:

  • Ana betts 和 Michael Trausch 建议的字符/块设备
  • mmap 设备(例如,您可以作为 /proc/memshare/mybuffer 访问)
  • 自定义系统。编写内核模块意味着您可以真正创建自己的方法来访问 proc 对象。这个内核中有很多样本。

希望这可以帮助。

于 2020-07-04T03:01:45.217 回答