“_IO(…)”在Linux中的C头文件中意味着什么?

我有一个Linux标准头文件,例如

/usr/src/linux-headers-3.2.0-35/include/linux/usbdevice_fs.h 

其中包含如下的define语句:

 #define USBDEVFS_SUBMITURB32 _IOR('U', 10, struct usbdevfs_urb32) #define USBDEVFS_DISCARDURB _IO('U', 11) #define USBDEVFS_REAPURB _IOW('U', 12, void *) 

‘_IOR’,’_IO’和’_IOW’是什么意思? 实际给出了什么值,例如USBDEVFS_DISCARDURB

它们基于ioctl函数和输入参数定义ioctl数字。 它们在内核中定义, include/asm-generic/ioctl.hinclude/asm-generic/ioctl.h

您需要在程序中包含 (或linux/asm-generic/ioctl.h )。 包括之前
/usr/src/linux-headers-3.2.0-35/include/linux/usbdevice_fs.h

您无法“预编译”此值(例如USBDEVFS_DISCARDURB ),因为它们在其他平台上可能不同。 例如,您在普通的旧版x86上开发代码,但是有人会尝试在x86_64 / arm / mips / etc上使用它。 所以你应该总是包含内核的ioctl.h来确保你正在使用正确的值。

这些也是其他地方定义的宏。

一般情况下,如果您希望在预处理器计算完成后看到您的代码,请使用

 gcc -E foo.c 

这将输出您预先处理的代码

例如:

foo.c的

 #define FORTY_TWO 42 int main(void) { int foo = FORTY_TWO; } 

会给你gcc -E foo.c

 int main(void) { int foo = 42; }