我目前正在编写Linux内核模块,并且在实现与用户空间程序的通信时遇到问题。
此内核模块需要接收用户空间程序发出的任务,并在完成后将结果发送回用户空间程序。在内核模块正在执行其工作时,应阻止用户空间程序。
我认为内核用户空间IPC或Unix套接字会很好,但我没有找到谷歌的例子。
目前,我的丑陋解决方案是导出chardev
并让用户空间程序将请求写入设备文件,并从中读取结果。但我只能在open()
次呼叫时发出一个请求,这会导致新问题。我真的需要一个IPC或类似套接字的东西。谢谢!
答案 0 :(得分:3)
有几种方法可以实现这一点。
最简单的方法是使用proc文件接口进行通信,特别是如果消息和结果的大小不到一页。
一般序列如下:
打开和关闭可以实现锁定,这样只有一个用户空间程序实例可以 实际上访问模块请求引擎。
任务请求通过写入proc文件发送,
如果模块理解命令,write函数将成功返回,在返回程序之前将初始化请求处理,如果读取proc文件很小,则实际上可以进行处理。如果处理非常复杂,那么我建议你阅读下半部分1(你可以简单地开始一个工作队列)。
读取或者触发“您希望模块执行的处理”。或等待BH完成处理,以防你这样做。您可以使用自旋锁或互斥锁来控制流量。
内核处理在完成后返回结果。
答案 1 :(得分:3)
使用netlink套接字提供用户空间程序和内核模块之间的全双工通信,而不是使用普通的套接字,proc fs和实现新的系统调用。