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>; 但后来我无法将此标头用于我的内核模块.
有没有更好的解决方案来解决这个问题,或者通常有两个独立但几乎相同的头文件?
你可以利用_ KERNEL _宏.
#ifdef __KERNEL__
#include <linux/ioctl.h>
#else
#include <sys/ioctl.h>
#endif
Run Code Online (Sandbox Code Playgroud)
您可能还必须抽象实际的ioctl值,但您会明白这一点.