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

Linux 使用实时内核头编译用户空间代码与默认头,linux,centos,Linux,Centos,根据客户要求,我使用默认内核安装了CentOS 5.6。安装此内核后,time.h文件包括#define CLOCK_MONOTONIC 现在,随着kernel-devel安装了一个实时内核,我们的代码希望使用CLOCK\u MONOTONIC\u RAW。它确实作为内核头文件的一部分存在,但是当我编译代码时,它在标准用户空间中找不到它 我的问题是,用实时内核包含/替换默认情况下找到的time.h的正确过程是什么?根据我的研究,它看起来像是坏的符号链接,那么应该如何处理呢?什么是程序或过程?升级

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

现在,随着kernel-devel安装了一个实时内核,我们的代码希望使用CLOCK\u MONOTONIC\u RAW。它确实作为内核头文件的一部分存在,但是当我编译代码时,它在标准用户空间中找不到它


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

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

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

使用CentOS 5默认安装时,您就完蛋了,因为glibc(2.5)和内核(2.6.18)都太旧了;glibc-2.12(commit glibc-2.12~111)和kernel-2.6.28是第一个具有单调_原始值的。这意味着它必须是CentOS 6,或者其他更好的


你可以在你的代码中使用类似于
\ifndef CLOCK\u monotional\u RAW、#define CLOCK\u monotional\u RAW 4、#endif
的东西来作弊,但这是不可移植的。

在我们的Fedora 11安装中,CLOCK\u monotional\u RAW的定义在/usr/local/include/linux/time.h中,但是这个头看起来基本上不可用。它没有声明clock\u gettime或定义clockid\u t,但它很高兴地定义了struct timerspec和struct itimerspec。前者前面有“#ifndef _STRUCT_TIMESPEC”,因此可以将其关闭,但后者完全不受保护,这意味着在同一个文件中包含和时,必须获得冲突的定义


您可以使用/usr/include中的标题来使用一些#include指令,但我放弃了,只是将linux版本复制到项目的源代码目录中,然后注释掉了我不需要的多余垃圾。便携性问题到此为止。

非常感谢您的回复。这是我在任何地方都能找到的最清楚的答案,所以谢谢你的解释。我使用的是比2.6.18更新的内核,但是头文件仍然位于“src”目录中。是否有将实时内核头文件复制到glibc位置的过程?我说得通吗?再次感谢您的回复。您不能只是走进M。。。。你不能用linux的time.h来覆盖glibc的bits/time.h,这永远不会起作用。