深入理解 I/O 控制(ioctl)及相关操作
1. 引言
在设备驱动开发中,I/O 控制(ioctl)是一个非常重要的系统调用,它允许用户空间程序与内核空间的设备驱动进行交互,以执行各种设备特定的操作。本文将详细介绍 ioctl 的相关知识,包括其命令的定义、返回值、预定义命令、参数使用、权限控制以及替代控制方法等内容。
2. ioctl 命令参数与返回值
2.1 命令参数
ioctl 命令参数(cmd)的值目前在内核中未被使用,且未来使用的可能性也较小。因此,如果开发者想偷懒,可以避免使用前面提到的复杂声明,直接声明一组标量数字。不过,这样做就无法利用位域的优势了。例如, <linux/kd.h> 头文件采用了这种老式方法,使用 16 位标量值来定义 ioctl 命令,这是因为当时的技术限制,而非开发者偷懒。现在更改它会导致不必要的兼容性问题。
2.2 返回值
ioctl 的实现通常基于命令号使用 switch 语句。当命令号与有效操作不匹配时,默认选择存在争议。一些内核函数返回 -EINVAL (“无效参数”),这是合理的,因为命令参数确实无效。然而,POSIX 标准规定,如果发出了不适当的 ioctl 命令,应返回 -ENOTTY 。在 libc5 及之前的所有库中,与该值关联的字符串是 “Not a typewriter”,只有 libc6 将消息改为 “Inappropriate ioctl for device”,这更切中要点。由于大多数最新的 Linux 系统基于
超级会员免费看
订阅专栏 解锁全文
105

被折叠的 条评论
为什么被折叠?



