Hardwareuhrzeit auslesen (ioctl)

27/11/2008 - 10:21 von Thomas Guettler | Report spam
Hallo,

da nach einem Serverneustart die Uhrzeit oft total falsch war,
will ich ein kleines Script schreiben um die Differenz zwischen
Systemzeit und Hardwarezeit (Linux) zu prüfen.

Ich könnte die Ausgaben von hwclock parsen, aber ich finde
es besser den Wert direkt auszulesen.

mit "strace hwclock", habe ich gesehen, dass
ioctl(fd, RTC_RD_TIME, ...) ausgeführt wird.

ioctl habe ich mit Python noch nie verwendet, sollte aber mit dem Modul fcntl möglich sein.

Wie bekomme ich den Wert von RTC_RD_TIME?

In /usr/include/linux/rtc.h steht:
#define RTC_RD_TIME _IOR('p', 0x09, struct rtc_time) /* Read RTC time */
Der resultierende Integerwert ist mir unklar. Auch wenn ich ihn rausbekomme,
würde ich lieber flexibel bleiben und im Python Quelltext RTC_RD_TIME verwenden,
und den Integerwert zur Laufzeit ermitteln.

Das Programm strace ist ja auch in der Lage zur Laufzeit den Integerwert
zu der Zeichenkette umzuwandeln. Also müsste es doch auch gehen RTC_RD_TIME
zur Laufzeit zu dem entsprechenden Integerwert zu wandeln, oder?



Hat jemand Tipps?

Thomas


Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de
 

Lesen sie die antworten

#1 Diez B. Roggisch
27/11/2008 - 11:18 | Warnen spam
Thomas Guettler wrote:

Hallo,

da nach einem Serverneustart die Uhrzeit oft total falsch war,
will ich ein kleines Script schreiben um die Differenz zwischen
Systemzeit und Hardwarezeit (Linux) zu prüfen.

Ich könnte die Ausgaben von hwclock parsen, aber ich finde
es besser den Wert direkt auszulesen.

mit "strace hwclock", habe ich gesehen, dass
ioctl(fd, RTC_RD_TIME, ...) ausgeführt wird.

ioctl habe ich mit Python noch nie verwendet, sollte aber mit dem Modul
fcntl möglich sein.

Wie bekomme ich den Wert von RTC_RD_TIME?

In /usr/include/linux/rtc.h steht:
#define RTC_RD_TIME _IOR('p', 0x09, struct rtc_time) /* Read RTC time
#*/
Der resultierende Integerwert ist mir unklar. Auch wenn ich ihn
rausbekomme, würde ich lieber flexibel bleiben und im Python Quelltext
RTC_RD_TIME verwenden, und den Integerwert zur Laufzeit ermitteln.

Das Programm strace ist ja auch in der Lage zur Laufzeit den Integerwert
zu der Zeichenkette umzuwandeln. Also müsste es doch auch gehen
RTC_RD_TIME zur Laufzeit zu dem entsprechenden Integerwert zu wandeln,
oder?



Hat jemand Tipps?



Das ist ein C-Makro. *Irgendwo* habe ich mal code gehabt der das nachbildet
in Python. Letztlich ist das aber ziemlich stulle, du musst nur mal nach
der Definition von _IOR schauen und das ganze dann nachprogrammieren. Die
struct rtctime kannst du als module struct string modellieren & uebergeben,
dann kannst du darauf die Laenge berechnen (das wird denke ich von _IOR
gemacht)

Eigentlich ist das aber overkill. Ich habe das gemacht, weil ich eine ganze
Reihe von ioctl-calls hatte. Fuer dich waere die opaque integer zahl denke
ich voellig ausreichend, zusammen mit nem Kommentar woher du die hast. Das
ist halt nunmal eine Magische Konstante, mag sie noch so "schick" als Makro
daherkommen. Wenn sich an der was aendert, bis du eh IDAG - du parsiertst
ja nicht das system-header-file...



Diez

Ähnliche fragen