我想知道是否有gcc宏可以告诉我Linux内核版本,以便我可以适当设置变量类型。如果没有,我该如何定义自己的宏来实现这一功能?
我想知道是否有gcc宏可以告诉我Linux内核版本,以便我可以适当设置变量类型。如果没有,我该如何定义自己的宏来实现这一功能?
linux/version.h文件有一个叫做KERNEL_VERSION
的宏,可以让您检查您想要的版本是否与当前安装的Linux头文件版本(LINUX_VERSION_CODE
)相符。例如,要检查当前的Linux头文件是否适用于内核v2.6.16或更早版本:
#include <linux/version.h>
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
...
#else
...
#endif
运行时获取版本信息的更好方法是使用include/linux/utsname.h中的utsname
函数。
char *my_kernel_version = utsname()->release;
这基本上是 /proc/version
获取当前内核版本的方式。
VERSION = 4
PATCHLEVEL = 9
SUBLEVEL = 37
gcc
不会知道这些信息。作为替代方案,您可以轻松地在运行时确定许多内核信息。
您可以定义您的运行时类型,例如:
struct unified_foo {
unsigned int kernel_version;
union {
kernel_x_foo_type k_x;
kernel_y_foo_type k_y;
kernel_z_foo_type k_z;
} u;
};
在运行时,可以查看/proc/version
(或者从内核运行环境中获取所需信息),并相应地设置kernel_version
。 kernel_x_foo_type
等是您希望根据内核版本进行条件判断的类型。调用代码需要查看kernel_version
并访问适当的u.k_x
、u.k_y
或u.k_z
数据。