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


11

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

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

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


您是否打算将此模块插入默认的CentOS内核?
bahamat 2012年

Answers:


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和define CLOCK_MONOTONIC_RAW。如果没有,并且您不能升级它,那么您将不得不采用这样的代码:

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

0

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


感谢您的答复。我检查了linux / time.h的位置,它也没有引用“ RAW”。我正在运行一个更新的实时内核,但是我只需要了解如何将确实引用了“ RAW”的新内核头文件传输到用户空间头文件中。我有任何道理还是正确的方法?再次感谢您的帮助。
cabanaboy 2012年

@cabanaboy,我不确定您要查找的位置或文件的来源,但是linux / time.h最应该定义CLOCK_MONOTONIC_RAW。是否运行实时内核也无关紧要;标头是相同的。
psusi 2012年

3
@cabanaboy,等等...您正在运行的旧操作系统必须在2.6.28之前的内核中附带。您是如何安装新内核的?如果您是自己从源代码构建的,那么您需要make install_headers。如果您有更新的内核软件包,则需要获取相应的更新的kernel_headers软件包。
psusi'1

0

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


0

我要确保我是针对新内核附带的标头构建的。 CLOCK_MONOTONIC_RAW应该在中定义linux/time.h。首先找出正在使用的标题,然后检查其在文件中的定义。您可以在代码中定义它(仅作为检查),以查看会发生什么。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.