用户空间程序是否存在包含内核模块中使用的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>
;但后来我无法将此标题用于我的内核模块。
这个问题是否有更好的解决方案,或者两个独立但几乎相同的头文件是否常见?
答案 0 :(得分:5)
您可以利用 _ KERNEL _ 宏。
#ifdef __KERNEL__
#include <linux/ioctl.h>
#else
#include <sys/ioctl.h>
#endif
你可能也必须抽象出实际的ioctl值,但你明白了。