【发布时间】:2011-12-30 01:31:57
【问题描述】:
我目前正在编写一个 Linux 内核模块,但在实现它与用户空间程序的通信时遇到了问题。
这个内核模块需要接收用户空间程序下发的任务,完成后将结果发送回用户空间程序。在内核模块执行其工作时,用户空间程序应该被阻止。
我认为内核用户空间 IPC 或 Unix 套接字会很不错,但我没有找到 Google 提供的示例。
目前我丑陋的解决方案是导出chardev 并让用户空间程序将请求写入设备文件,并从中读取结果。但是每次open() 调用我只能发出一个请求,这会导致新的问题。我真的需要一个 IPC 或类似套接字的东西。谢谢!
【问题讨论】:
-
查看 netlink API。
-
@moshbear 很到位。 Netlink 非常适合这项任务。
-
chardev听起来不错。为什么每次打开只能发出一个请求(2)?为什么不每次写入一个请求(2)并通过读取(2)返回结果?当您的模块正在发送数据时,用户进程将在 read(2) 中被阻止。你的问题在哪里? -
谢谢@moshbear,这似乎正是我需要的:)
-
@MackieMesser 是的,这会起作用,但我必须检查
write(2)调用是否写了完整的消息。如果用户程序使用fprintf()向chardev写入请求,那么内核模块可能会收到部分消息。通过使用套接字或IPC,我想我可以保证消息是完整的。
标签: c sockets linux-kernel ipc kernel-module