gettimeofday, settimeofday - Lire / écrire l'heure actuelle.
Les fonctions
gettimeofday
et
settimeofday
servent à lire ou programmer l'heure ainsi que le fuseau horaire (timezone).
L'argument
tv
est une structure
timeval
décrite dans /usr/include/sys/time.h :
struct timeval {
int tv_sec; /* secondes */
int tv_usec; /* microsecondes */
};
et donne le nombre de secondes et microsecondes écoulées depuis le 1er janvier 1970 (voir
time(2)).
L'argument
tz
est une structure
timezone
composée ainsi :
struct timezone {
int tz_minuteswest; /* minutes à l'ouest de Greenwich */
int tz_dsttime; /* type de changement horaire */
};
L'utilisation de la structure timezone est obsolète, le champ
tz_dsttime
n'a jamais été utilisé sous Linux, il n'a jamais été géré, et
ne le sera jamais par la libc ou glibc.
Toute occurrence de ce champ dans les sources du noyau (sauf
pour les déclarations) est un bug. Ainsi le paragraphe suivant
n'a qu'un intérêt historique.
Le champ
tz_dsttime
contient une constante symbolique (dont les valeurs sont fournies
ci-dessous) qui indique quelle partie du changement horaire annuel
est en cours.
(Remarque : Cette valeur est constante tout au long de l'année, elle
n'indique pas réellement la valeur horaire en cours, elle sélectionne
un algorithme).
Les changements horaires (Daylight saving - DST) sont
définis comme suit :
DST_NONE /* Aucun */
DST_USA /* USA */
DST_AUST /* Australie */
DST_WET /* Europe occidentale */
DST_MET /* Europe centrale */
DST_EET /* Europe Orientale */
DST_CAN /* Canada */
DST_GB /* Grande-Bretagne et Irlande */
DST_RUM /* Roumanie */
DST_TUR /* Turquie */
DST_AUSTALT /* Australie avec décalage en 1986 */
Il est évident que le décalage horaire en cours ne peut pas
être uniquement fourni par un algorithme par pays. Ce décalage
dépend de décisions politiques imprévisibles. Ainsi cette méthode
des fuseaux horaires a été abandonnée.
Sous Linux, durant un appel à
settimeofday
le champ
tz_dsttime
doit être nul.
Sous Linux, il existe une sémantique particulière associée à l'appel
système
settimeofday
si, durant la première invocation (après le boot), il a un argument
tz
non-NULL, un argument
tv
NULL et un champ
tz_minuteswest
différent de zéro. Dans ce cas, on suppose que l'horloge CMOS de la
machine est configurée sur le temps local, et que l'on doit l'augmenter
de cette valeur pour obtenir le temps UTC.
Bien entendu, il faut éviter autant que possible d'utiliser cette particularité.
Les macros suivantes permettent de manipuler les structures timeval :
#define timerisset(tvp)\
((tvp)->tv_sec || (tvp)->tv_usec)
#define timercmp(tvp, uvp, cmp)\
((tvp)->tv_sec cmp (uvp)->tv_sec ||\
(tvp)->tv_sec == (uvp)->tv_sec &&\
(tvp)->tv_usec cmp (uvp)->tv_usec)
#define timerclear(tvp)\
((tvp)->tv_sec = (tvp)->tv_usec = 0)
Si
tv
ou
tz
est nulle, la structure correspondante n'est ni programmée ni renvoyée.
Seul le Super-User peut appeler
settimeofday.
Christophe Blaess, 1996-2003.