Linux 这个宏(MY_MACIG,0,int)是什么意思?

Linux 这个宏(MY_MACIG,0,int)是什么意思?,linux,unix,kernel,ioctl,netlink,Linux,Unix,Kernel,Ioctl,Netlink,我正在浏览ioctl示例程序,以检查它如何与内核空间通信。在程序写入中,IOCTL用作命令 #define WRITE_IOCTL _IOW(MY_MACIG, 1, int) ioctl(fd, WRITE_IOCTL, "hello world") 我无法理解什么是\u IOW(MY\u MACIG,1,int)。 这是我下载程序的链接。请帮帮我。 正如您所知,ioctl应该是唯一的,如Linux设备驱动程序手册中所述: ioctl命令编号在整个系统中应是唯一的,以便 防止向错误的用户发出

我正在浏览ioctl示例程序,以检查它如何与内核空间通信。在程序写入中,IOCTL用作命令

#define WRITE_IOCTL _IOW(MY_MACIG, 1, int)
ioctl(fd, WRITE_IOCTL, "hello world")
我无法理解什么是
\u IOW(MY\u MACIG,1,int)
。 这是我下载程序的链接。请帮帮我。

正如您所知,ioctl应该是唯一的,如Linux设备驱动程序手册中所述:

ioctl命令编号在整个系统中应是唯一的,以便 防止向错误的用户发出正确的命令而导致错误 设备。这种不匹配不太可能发生,程序也可能发生 发现自己试图更改非串行端口输入的波特率 流,如FIFO或音频设备。如果每个ioctl编号为 唯一性,应用程序将获得一个EINVAL错误,而不是在 做一些意想不到的事

此外,ioctl可能需要向内核空间写入数据和/或从内核空间读取数据

当创建自己的执行ioctl的驱动程序时,他需要在ioctl命令中描述所有这些

_IO、_IOW、_IOR、_IORW是帮助宏,用于创建唯一的ioctl标识符并添加所需的R/W所需功能(方向)

这些参数可以采用以下参数:幻数、命令id和将要传递的数据类型(如果有)

幻数是一个唯一的数字,它允许驾驶员检测错误,如LDD手册引用中提到的错误

命令id是您的dirver了解需要调用什么命令的一种方法

最后一个参数(类型)将允许内核理解要复制的大小

希望这有帮助

PS:您可以在Linux设备驱动程序手册(第6章)中获得更多详细信息

来自:

Linux头文件
/usr/include/asm/ioctl.h
定义了必须用于创建ioctl命令号的宏。这些宏采用三个参数的不同组合:

  • 键入,一个8位整数,被选择为特定于设备驱动程序。应选择类型,以免与可能“侦听”同一文件描述符的其他驱动程序冲突。(例如,在内核内部,TCP和IP堆栈使用不同的数字,因为发送到套接字文件描述符的ioctl可能由两个堆栈检查。)
  • 编号,一个8位整数命令编号。在驱动程序中,应该为驱动程序服务的每种不同类型的ioctl命令选择不同的数字
  • 数据类型,用于计算客户端和驱动程序之间交换的字节数的类型名称。例如,此参数是结构的名称
用于生成命令编号的宏有:

  • \u IO(int-type,int-number),用于一个简单的ioctl,它只发送类型和数字,只接收(整数)返回值
  • \u IOR(int类型、int编号、数据类型),用于从设备驱动程序读取数据的ioctl。将允许驱动程序向用户返回sizeof(数据类型)字节
  • \u IOW(int类型、int编号、数据类型),类似于IOR,但用于将数据写入驱动程序
  • \u IORW(int-type,int-number,data-type),IOR和IOW的组合。也就是说,数据既被写入驱动程序,又被客户端从驱动程序读回

如果您认为我的答案是好的,请考虑投票支持,否则请评论:)OP链接已断开。请参阅以获取代码。请参阅重复问题不太正确,但有些设备使用其主数字作为幻数,只要它是唯一的,就可以了,请参阅内核文档:良好信息。我在找东西的时候偶然发现了这个。我想补充一点,你可以从技术上看到这些宏的实现这[一个ioctl需要是唯一的]是错误的,我相信,这是一个惯例,ioctl参数是唯一的没有技术原因。尽管如此,遵循惯例或许是个好主意,但这并不是必须的。此外,我怀疑内核是否关心调用哪个设备的幻数,ioctl第一个参数会做到这一点。@Ayman Khamouma感谢您更新答案。在进一步的谷歌搜索之后,我不确定是否有需要遵循的惯例。因此,虽然我认为我的评论可能是完全正确的(即参数不需要是唯一的,也不用于查找设备),但魔法数字中可能仍有一些东西必须遵循某种约定。因此,任何人如果发现自己处于需要一个新的幻数的位置,就要更好地遵循惯例,使用用来产生这些幻数的宏。