使用实时内核头来编译用户空间代码与默认头

时间:2012-01-04 21:45:00

标签: linux centos

根据客户要求,我使用默认内核安装了CentOS 5.6。安装此内核后,time.h文件包含#define CLOCK_MONOTONIC。

现在,安装了一个实时内核以及kernel-devel,我们的代码想要使用CLOCK_MONOTONIC_RAW。它确实作为内核头文件的一部分存在,但是当我编译代码时,它在标准用户空间中找不到它。

我的问题是,包含/替换默认情况下使用实时内核找到的time.h的正确程序是什么?根据我的研究,看起来符号链接很糟糕,那么它应该如何处理呢?什么是程序或过程?根据客户要求,升级到CentOS 6.0或5.7不是一种选择。感谢。

2 个答案:

答案 0 :(得分:1)

用户空间代码使用用户空间标头。内核模块使用内核头文件(这就是为什么符号链接不好,因为你会将用户空间代码与内核头文件混合在一起)。

要获得CLOCK_MONOTONIC_RAW的定义,您必须更新glibc - 对于CLOCK_定义,不使用/ usr / include / linux中的“borderline”(它们仍然算作用户空间!)标题。

使用CentOS 5默认安装,你搞砸了,因为glibc(2.5)和内核(2.6.18)都太旧了; glibc-2.12(提交glibc-2.12~111)和kernel-2.6.28是第一个拥有MONOTONIC_RAW的产品。这意味着它必须是CentOS 6,或其他更好的东西。

您可以尝试在代码中使用类似#ifndef CLOCK_MONOTONIC_RAW, #define CLOCK_MONOTONIC_RAW 4, #endif的内容来欺骗自己的方式,但这会被视为不可移植。

答案 1 :(得分:0)

我们的Fedora 11安装中CLOCK_MONOTONIC_RAW的定义在/usr/local/include/linux/time.h中,但这个标题似乎基本上无法使用。它没有声明clock_gettime或定义clockid_t,但它很高兴地定义了struct timerspec和struct itimerspec。前者以“#ifndef _STRUCT_TIMESPEC”开头,因此您可以将其关闭,但后者完全不受保护,这意味着您不能包含并且在同一文件中不会出现冲突的定义。

可能会有一些#include指令的扭曲,你可以使用/ usr / include中的头文件来解决这个问题,但是我放弃了,只是将linux版本复制到了我的项目的源代码目录中,然后发表了评论我不需要的额外垃圾。非常便于携带。