这个macros是什么意思_IOR(MY_MACIG,0,int)?

我正在通过ioctl示例程序来检查它如何与内核空间进行通信。 在程序WRITE_IOCTL被用作命令

#define WRITE_IOCTL _IOW(MY_MACIG, 1, int) ioctl(fd, WRITE_IOCTL, "hello world") 

我无法理解什么是_IOW(MY_MACIG, 1, int) 。 这里是我下载程序的链接。 请帮帮我。 http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-4.html

Solutions Collecting From Web of "这个macros是什么意思_IOR(MY_MACIG,0,int)?"

正如你可能知道的那样,一个ioctl应该是唯一的,正如Linux设备驱动程序书中所解释的那样:

ioctl命令号在整个系统中应该是唯一的,以防止由错误的设备发出正确的命令所引起的错误。这种不匹配不可能发生,程序可能会发现自己试图改变非易失性存储器的波特率,串行端口输入流,例如FIFO或音频设备。 如果每个ioctl编号都是唯一的,那么应用程序会得到一个EINVAL错误,而不是成功地做一些非预期的事情。

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

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

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

这些可以采用以下参数:幻数,命令ID以及将要传递的数据类型(如果有的话)

幻数是一个独特的数字,可以让驾驶员检测到错误,例如LDD书中所提到的错误。

命令ID是您的dirver了解需要调用哪个命令的一种方式。

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

希望这可以帮助。

PS:你可以在Linux设备驱动程序书(第6章)中有更多的细节https://lwn.net/images/pdf/LDD3/ch06.pdf

来自http://www.circlemud.org/jelson/software/fusd/docs/node31.html

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

  • 类型 ,一个8位整数被选择为特定于设备驱动程序。 类型应该选择,以免与可能“聆听”相同的文件描述符的其他驱动程序冲突。 (例如,在内核中,TCP和IP堆栈使用不同的数字,因为发送到套接字文件描述符的ioctl可能会被两个堆栈检查。
  • 数字 ,一个8位整数命令编号。 在驱动程序中,应为驱动程序提供的每种不同类型的ioctl命令选择不同的数字
  • data_type ,用于计算客户端和驱动程序之间交换多少字节的类型的名称。 例如,这个论点就是结构的名称。

用来生成命令号的宏是:

  • _IO(int type,int number) ,用于一个简单的ioctl,只发送类型和数字,并且只返回(整数)retval
  • _IOR(int type,int number,data_type) ,用于从设备驱动程序读取数据的ioctl。 驱动程序将被允许将sizeof(data_type)字节返回给用户
  • _IOW(int类型,int数字,data_type) ,类似于_IOR,但用于将数据写入驱动程序
  • _IORW(int类型,int数字,data_type) ,_IOR和_IOW的组合。 也就是说,数据都写入驱动程序,然后由客户端从驱动程序读回