有说到过使用netlink实现应用层与内核进行通信。ioctl也能够发送数据,是怎么实现的呢?
本文简单的记录下。
使用ioctl系统调用是用户空间向内核交换数据的常用方法之一,从ioctl这个名称上看,本意是针对I/O设备进行的控制操作,但实际并不限制是真正的I/O设备,可以是任何一个内核设备即可。
只记得在最开始写字符设备驱动时,有用到过ioctl发通知到驱动中,通过定义的 file_operations的ioctl的动作去实现动作,应该与此类似。
在内核空间中ioctl是很多内核操作结构的一个成员函数,如文件操作结构struct
file_operations(include/linux/fs.h)、协议操作结构struct
proto_ops(include/linux/net.h)等、tty操作结构struct
tty_driver(include/linux/tty_driver.h)等,而这些操作结构分别对应各种内核设备,只要在用户空间打开这些设备,如I/O设备可用open(2)打开,网络协议可用socket(2)打开等,获取一个文件描述符后,就可以在这个描述符上调用ioctl(2)来向内核交换数据
ioctl(2)函数的基本使用格式为:
int ioctl(int fd, int cmd, void *data)
第一个参数是文件描述符;cmd是操作命令,一般分为GET、SET以及其他类型命令,GET是用户空间进程从内核读数据,SET是用户空间进程向内核写数据,cmd虽然是一个整数,但是有一定的参数格式的,下面再详细说明;第三个参数是数据起始位置指针,
参考资料
https://www.csdn.net/tags/Mtjacg0sMjMzODktYmxvZwO0O0OO0O0O.html