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

时间:2013-04-18 20:36:46

标签: c linux linux-kernel linux-device-driver ioctl

用户空间程序是否存在包含内核模块中使用的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>;但后来我无法将此标题用于我的内核模块。

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

1 个答案:

答案 0 :(得分:5)

您可以利用 _ KERNEL _ 宏。

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

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