在用户空间程序中包含ioctl代码
问题描述:
用户空间程序是否包含用于内核模块中的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
码的头,我包括我的内核模块代码。我考虑在我的用户空间应用程序中只包含这个头文件,但我意识到在大多数系统上(例如没有导出内核头文件的系统),文件路径可能不存在。
解决方案似乎是要将include行更改为:#include <sys/ioctl.h>
;但后来我无法将这个头文件用于我的内核模块。
是否有更好的解决方案来解决这个问题,还是常见的是有两个单独但几乎相同的头文件?
答
您可以利用宏观上的_ KERNEL _宏。
#ifdef __KERNEL__
#include <linux/ioctl.h>
#else
#include <sys/ioctl.h>
#endif
您可能需要抽象实际的ioctl值太多,但你的想法。
如果你关心维护,你可以在构建你的模块时从你的内核头文件自动生成一个用户标题头。 –
有没有一种方法来评估一个预处理宏,并用GCC的预处理器将它打印到一个文件中? –
如果不是,通常编写一个独立的C程序,通过将定义传递给printf来生成userland标头;还是有另一种优选的方法? –