目录
在 Linux 内核中,ioctl
函数是用户空间与设备驱动交互的重要接口,用于实现设备控制、配置和状态查询等操作。一个规范的 ioctl
函数通常遵循以下结构和模式:
1. 函数签名
c
复制
long (*ioctl)(struct file *filp, unsigned int cmd, unsigned long arg);
- 参数:
filp
: 文件指针,关联到打开的设备文件。cmd
: 用户传递的控制命令(整数标识符)。arg
: 用户空间传递的参数(可以是整数或指针)。
- 返回值:
0
或正数:操作成功。- 负错误码:操作失败(如
-EINVAL
、-ENOMEM
)。
2. 典型结构
c
复制
long my_device_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {
struct my_device *dev = filp->private_data;
int ret = 0;
// 1. 参数校验
if (!dev) {
return -ENODEV;
}
// 2. 命令分发(switch-case)
switch (cmd) {
case MY_IOCTL_CMD1:
// 处理命令1
break;
case MY_IOCTL_CMD2:
// 处理命令2
break;
default:
ret = -ENOTTY; // 无效命令
break;
}
return ret;
}