"_IO(...)"在Linux中的C头文件中意味着什么?

Ale*_*lex 9 c header-files c-preprocessor

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

/usr/src/linux-headers-3.2.0-35/include/linux/usbdevice_fs.h
Run Code Online (Sandbox Code Playgroud)

其中包含define如下声明:

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

'_IOR','_IO'和'_IOW'是什么意思?实际上给了什么价值USBDEVFS_DISCARDURB

wer*_*dle 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以确保使用正确的值.

  • IOCTL应该在版本之间保持稳定,因为它们代表用户ABI.旧二进制文件必须适用于新内核.但是,IOCTL值在各种平台上有所不同,这就是为什么应该使用标头中的值:在多个平台上保持可移植性. (2认同)