在内核与用户的通信中,Linux 内核有意将正常的数据以及功能的选择用不同的函数来实现,让 read() / write() 函数专注于数据的读写。让功能的选择和设置通过 ioctl 函数来实现,比如串口通信时让 read() / write() 进行正常的数据收发,而串口波特率、数据格式的设置通过 ioctl 函数来实现。
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);
功能:进行 io 控制
参数:
fd:文件描述符request:功能码(看第 3 节)…:可以有第三个参数,也可以没有,如果添加第三个参数,尽量传递用户空间的指针返回值:成功返回 0,失败返回错误码
long (*unlocked_ioctl) (struct file *file, unsigned int cmd, unsigned long arg){}
参数:
cmd:用来接收用户层 ioctl 函数的第二个参数arg:用来接收 ioctl 函数第三个参数为了追求功能码的唯一性,我们需要对功能码进行编码,在编码时要添加实现的功能是读还是写,也要包含 ioctl 第三个参数的大小灯信息。可以在 Linux 内核源码的该目录下找到功能码的编码规则:
linux/Documentation/userspace-api/ioctl at master · torvalds/linux
功能码的类别: