Gemäß den Kundenanforderungen habe ich CentOS 5.6 mit dem Standardkernel installiert. Wenn dieser Kernel installiert ist, enthält die Datei time.h die #define CLOCK_MONOTONIC
.
Jetzt wurde zusammen mit der Kernel-Entwicklung ein Echtzeit-Kernel installiert, den unser Code gerne verwenden würde CLOCK_MONOTONIC_RAW
. Es existiert als Teil der Header-Dateien des Kernels, aber wenn ich unseren Code kompiliere, findet er ihn nicht in den Standard-Userspace-Includes.
Meine Frage ist, wie ist das richtige Verfahren zum Einschließen / Ersetzen des time.h
gefundenen Standardwerts durch den Echtzeitkernel? Aus meiner Forschung geht hervor, dass Symlinks schlecht sind. Wie sollte damit umgegangen werden? Was ist das Verfahren oder der Prozess? Ein Upgrade auf CentOS 6.0 oder 5.7 ist gemäß den Kundenanforderungen keine Option.
quelle
Antworten:
Es muss eine wichtige Unterscheidung getroffen werden, woher Header-Dateien stammen:
<time.h>
wird von glibc bereitgestellt (zB dasglibc-headers
Paket)<linux/time.h>
wird von den Linux-Kernel-Headern bereitgestellt.Das Ändern des Kernels und seiner Header-Pakete hat keine Auswirkungen
<time.h>
. Das kann nur durch Ändern von glibc erreicht werden.Sie sollten feststellen, dass glibc
<time.h>
enthält<bits/time.h>
, das als zB aufgelöst/usr/include/x86_64-linux-gnu/bits/time.h
und definiert wirdCLOCK_MONOTONIC_RAW
. Wenn dies nicht der Fall ist und Sie es nicht aktualisieren können, müssen Sie auf folgenden Code zurückgreifen:quelle
Du musst nur
#include <linux/time.h>
quelle
make install_headers
. Wenn Sie ein aktualisiertes Kernel-Paket erhalten haben, müssen Sie das entsprechende aktualisierte kernel_headers-Paket erhalten.Die Header, die Ihre Distribution installiert, sind nicht die im Kernel, sondern sanitzed / "userspaced" -Versionen. Sie müssten eine Kopie der Header in include / linux in den Kernelquellen abrufen und so einrichten, dass sie denen in / usr / include / linux vorgezogen werden (das -I-Flag für gcc muss frob sein). Und prüfen Sie, ob nichts fehlschlägt.
quelle
Ich würde sicherstellen, dass ich gegen die Header baue, die mit dem neuen Kernel geliefert wurden.
CLOCK_MONOTONIC_RAW
sollte definiert werden inlinux/time.h
. Finden Sie zuerst heraus, welche Header Sie verwenden, und überprüfen Sie, wie sie in der Datei definiert sind. Sie können es in Ihrem Code definieren (nur als Prüfung), um zu sehen, was passiert.quelle