[英]what is the meaning of this macro _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
您可能知道,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
来自http://www.circlemud.org/jelson/software/fusd/docs/node31.html :
Linux头文件/usr/include/asm/ioctl.h
定义了必须用于创建ioctl命令编号的宏。 这些宏采用三种参数的各种组合:
用于生成命令编号的宏是:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.