2

用户空间程序是否存在包含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

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

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

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

4

1 回答 1

6

您可以利用_ KERNEL _宏。

#ifdef __KERNEL__
#include <linux/ioctl.h>
#else
#include <sys/ioctl.h>
#endif

您可能也必须抽象出实际的 ioctl 值,但您明白了。

于 2013-04-18T21:02:45.347 回答