您可能知道,ioctl 应该是唯一的,如 Linux 设备驱动程序一书中所述:
ioctl 命令号在整个系统中应该是唯一的,以防止由于向错误的设备发出正确的命令而导致错误。这种不匹配并非不可能发生,并且程序可能会发现自己试图更改非串行端口输入流,例如 FIFO 或音频设备。如果每个 ioctl 编号都是唯一的,则应用程序会收到 EINVAL 错误,而不是成功地做一些非预期的事情。
此外,ioctl 可能需要向内核空间写入数据和/或从内核空间读取数据。
当一个人创建自己的执行 ioctl 的驱动程序时,他需要在 ioctl 命令中描述所有这些。
_IO、_IOW、_IOR、_IORW 是帮助宏,用于创建唯一的 ioctl 标识符并添加所需的 R/W 所需功能(方向)。
这些可以采用以下参数:幻数、命令 id 和将传递的数据类型(如果有)
幻数是一个唯一的数字,它将允许驱动程序检测错误,例如 LDD 书中引用中提到的错误。
命令 id 是您的驱动程序了解需要调用什么命令的一种方式。
最后一个参数(类型)将允许内核了解要复制的大小。
希望这可以帮助。
PS:您可以在 Linux 设备驱动程序书(第 6 章)
https://lwn.net/images/pdf/LDD3/ch06.pdf中了解更多详细信息