Linux 这个宏(MY_MACIG,0,int)是什么意思?
我正在浏览ioctl示例程序,以检查它如何与内核空间通信。在程序写入中,IOCTL用作命令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命令编号在整个系统中应是唯一的,以便 防止向错误的用户发出
#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的组合。也就是说,数据既被写入驱动程序,又被客户端从驱动程序读回