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

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

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

现在,实时内核与内核开发一起安装,我们的代码希望使用CLOCK_MONOTONIC_RAW.它确实作为内核头文件的一部分存在,但是当我编译代码时,它在标准用户空间包含中找不到它。

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

答案1

头文件的来源有一个关键的区别:

  • <time.h>由glibc提供(例如glibc-headers包)
  • <linux/time.h>由 Linux 内核头文件提供。

更改内核及其头包不会影响<time.h>.只有改变 glibc 才能做到这一点。

您应该发现 glibc 的<time.h>include<bits/time.h>解析为 eg/usr/include/x86_64-linux-gnu/bits/time.h并定义了CLOCK_MONOTONIC_RAW。如果没有,并且您无法升级它,那么您将不得不求助于包含如下代码:

#include <time.h>
#ifndef CLOCK_MONOTONIC_RAW
# define CLOCK_MONOTONIC_RAW 4
#endif

答案2

你只需要#include <linux/time.h>

答案3

您的发行版安装的标头是不是内核中的版本,它们是清理/“用户空间”版本。您必须在内核源代码中的 include/linux 中获取标头的副本并进行设置,以便优先使用它们而不是 /usr/include/linux 中的标头(需要为 gcc 删除 -I 标志)。并检查是否没有失火。

答案4

我会确保我是根据新内核附带的标头进行构建的。 CLOCK_MONOTONIC_RAW应该定义在linux/time.h.首先找出您正在使用哪些标头,并检查其在文件中的定义方式。您可以在代码中定义它(仅作为检查)以查看会发生什么。

相关内容