Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does '_IO(...)' mean in C headers in Linux?

I have a Linux standard header file e.g.

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

which contain define statements as follows:

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

What does '_IOR', '_IO' and '_IOW' mean? What value is actually given e.g. to USBDEVFS_DISCARDURB?

like image 491
Alex Avatar asked Jan 31 '13 13:01

Alex


People also ask

What are headers in linux?

linux-headers is a package providing the Linux kernel headers. These are part of the kernel, although they are shipped separately (further reasoning is available: [1]). The headers act as an interface between internal kernel components and also between userspace and the kernel.

Why we use header files in C?

C language has numerous libraries that include predefined functions to make programming easier. In C language, header files contain the set of predefined standard library functions. You request to use a header file in your program by including it with the C preprocessing directive “#include”.

What is _iowr?

_IO, _IOW, _IOR, _IORW are helper macros to create a unique ioctl identifier and add the required R/W needed features (direction). These can take the following params: magic number, the command id, and the data type that will be passed (if any)

What is the use of header file?

Header files are used in C++ so that you don't have to write the code for every single thing. It helps to reduce the complexity and number of lines of code. It also gives you the benefit of reusing the functions that are declared in header files to different .


1 Answers

They define ioctl numbers, based on ioctl function and input parameters. The are defined in kernel, in include/asm-generic/ioctl.h.

You need to include <linux/ioctl.h> (or linux/asm-generic/ioctl.h) in your program. Before including
/usr/src/linux-headers-3.2.0-35/include/linux/usbdevice_fs.h

You can't "precompile" this values (e.g. USBDEVFS_DISCARDURB), because they can be different on other platforms. For example, you are developing your code on plain old x86, but then someone will try to use it on x86_64/arm/mips/etc. So you should always include kernel's ioctl.h to make sure, you are using right values.

like image 59
werewindle Avatar answered Sep 22 '22 13:09

werewindle