10

我有一个 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

4

2 回答 2

8

它们根据 ioctl 函数和输入参数定义 ioctl 编号。在内核中定义,在include/asm-generic/ioctl.h.

您需要在程序中包含<linux/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以确保您使用的是正确的值。

于 2013-01-31T14:18:50.187 回答
1

这些也是在别处定义的宏。

一般来说,如果您想在计算预处理器后查看您的代码,请使用

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;
}
于 2013-01-31T13:28:13.223 回答