我是Linux内核模块编程的新手.从我到目前为止阅读的材料中,我发现用户程序有3种方式来请求服务或与Linux内核模块通信
/ dev中的设备文件
/ proc文件系统中的文件
ioctl()调用
问题:我们还有哪些其他选项可用于用户程序和Linux内核模块之间的通信?
您的选项3)实际上是选项1)的子选项 - ioctl()
是与设备文件交互的一种方式(read()
并且write()
是通常的方式).
另外两个值得考虑的方法是:
该sysfs
文件系统;
Netlink套接字.
基本上,许多标准IPC机制 - 参见 http://en.wikipedia.org/wiki/Inter-process_communication - 可以使用:
文件和内存映射文件:设备文件(如上所述)或/ dev,procfs,sysfs,debugfs或您自己的文件系统中的类似特殊文件,具有读/写,ioctl,mmap的笛卡尔积
可能是信号(用于kthread)
套接字:使用选择的协议:TCP,UDP(参见knfsd
,但可能不太容易),PF_LOCAL或Netlink(许多子接口 - 基本netlink,genetlink,Connector,...)
此外,
4. 系统调用(虽然模块不是真的可用)
5. 网络接口(类似于tun).
Netlink的工作示例 - 仅举几例 - 可以在例如中找到
git://git.netfilter.org/libmnl(userspace side)
net/core/rtnetlink.c(base netlink)
net/netfilter/nf_conntrack_netlink.c(nfnetlink)
fs/quota/netlink.c(genetlink)