1. 概述

在内核与用户的通信中,Linux 内核有意将正常的数据以及功能的选择用不同的函数来实现,让 read() / write() 函数专注于数据的读写。让功能的选择和设置通过 ioctl 函数来实现,比如串口通信时让 read() / write() 进行正常的数据收发,而串口波特率、数据格式的设置通过 ioctl 函数来实现。

2. API函数

2.1 函数原型

#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);

功能:进行 io 控制

参数:

返回值:成功返回 0,失败返回错误码

2.2 内核中的操作方法

long (*unlocked_ioctl) (struct file *file, unsigned int cmd, unsigned long arg){}

参数:

3. ioctl 函数的功能码

为了追求功能码的唯一性,我们需要对功能码进行编码,在编码时要添加实现的功能是读还是写,也要包含 ioctl 第三个参数的大小灯信息。可以在 Linux 内核源码的该目录下找到功能码的编码规则:

linux/Documentation/userspace-api/ioctl at master · torvalds/linux

功能码的类别: