De acordo com os requisitos do cliente, instalei o CentOS 5.6 com o kernel padrão. Com esse kernel instalado, o arquivo time.h inclui o arquivo #define CLOCK_MONOTONIC
.
Agora, um kernel em tempo real foi instalado junto com o kernel-devel e nosso código gostaria de usar CLOCK_MONOTONIC_RAW
. Ele existe como parte dos arquivos de cabeçalho do kernel, mas quando eu compilo nosso código, ele não o encontra no espaço de usuário padrão incluído.
Minha pergunta é: qual é o procedimento adequado para incluir / substituir o time.h
encontrado por padrão pelo kernel em tempo real? Na minha pesquisa, parece que os links simbólicos são ruins, então como deve ser tratado? Qual é o procedimento ou processo? A atualização para o CentOS 6.0 ou 5.7 não é uma opção de acordo com os requisitos do cliente.
fonte
Respostas:
Há uma distinção importante a ser feita sobre a origem dos arquivos de cabeçalho:
<time.h>
é fornecido pela glibc (por exemplo, oglibc-headers
pacote)<linux/time.h>
é fornecido pelos cabeçalhos do kernel do Linux.Alterar o kernel e seus pacotes de cabeçalho não afetará
<time.h>
. Somente a alteração da glibc fará isso.Você deve achar que o glibc
<time.h>
inclui o<bits/time.h>
que resolve como por exemplo/usr/include/x86_64-linux-gnu/bits/time.h
e defineCLOCK_MONOTONIC_RAW
. Caso contrário, e você não pode atualizá-lo, será necessário incluir um código como este:fonte
Você só precisa
#include <linux/time.h>
fonte
make install_headers
. Se você recebeu um pacote de kernel atualizado, precisa obter o pacote kernel_headers atualizado correspondente.Os cabeçalhos que sua distribuição instala não são os do kernel, são versões com sanitzed / "userpaced". Você precisaria obter uma cópia dos cabeçalhos em include / linux nas fontes do kernel e configurá-los para que eles sejam usados preferencialmente aos do / usr / include / linux (é necessário usar o sinalizador -I para o gcc). E verifique se nada falha.
fonte
Eu teria certeza de que estou construindo contra os cabeçalhos que acompanham o novo kernel.
CLOCK_MONOTONIC_RAW
deve ser definido emlinux/time.h
. Primeiro descubra quais cabeçalhos você está usando e verifique como eles estão definidos no arquivo. Você pode defini-lo em seu código (apenas como uma verificação) para ver o que acontece.fonte