在用户空间程序中包含ioctl代码

Vil*_*ray 2 c linux ioctl linux-device-driver linux-kernel

用户空间程序是否存在包含ioctl内核模块中使用的代码的常见做法.

mydev.h:

#ifndef MYDEV_H
#define MYDEV_H

#define <linux/ioctl.h>

#define MYDEV_IOC_MAGIC 'C'

#define MYDEV_IOC_FOO   _IO(MYDEV_IOC_MAGIC, 0)
#define MYDEV_IOC_BAR   _IOW(MYDEV_IOC_MAGIC, 1, int)

#endif
Run Code Online (Sandbox Code Playgroud)

我通常将我的ioctl代码放在一个标题中,我将其包含在我的内核模块代码中.我考虑在我的用户空间应用程序中包含此标题,但我意识到大多数系统(例如没有导出的内核头文件的系统)可能不存在linux/ioctl.h文件路径.

解决方案似乎是将include行更改为:#include <sys/ioctl.h>; 但后来我无法将此标头用于我的内核模块.

有没有更好的解决方案来解决这个问题,或者通常有两个独立但几乎相同的头文件?

Zif*_*ion 5

你可以利用_ KERNEL _宏.

#ifdef __KERNEL__
#include <linux/ioctl.h>
#else
#include <sys/ioctl.h>
#endif
Run Code Online (Sandbox Code Playgroud)

您可能还必须抽象实际的ioctl值,但您会明白这一点.