NOMBRE¶
gettimeofday, settimeofday - pone u obtiene la hora
SINOPSIS¶
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone
*tz);
int settimeofday(const struct timeval *tv , const struct
timezone *tz);
DESCRIPCIÓN¶
Las funciones
gettimeofday y
settimeofday pueden obtener y poner
tanto la hora como una zona horaria. El argumento
tv es una estructura
timeval, tal como se especifica en /usr/include/sys/time.h:
struct timeval {
long tv_sec; /* segundos */
long tv_usec; /* microsegundos */
};
y da el númer de segundos y microsegundos desde la Época
(véase
time(2)). El argumento
tz es una estructura
timezone :
struct timezone {
int tz_minuteswest; /* minutos al O de Greenwich */
int tz_dsttime; /* tipo de correción horaria invierno/verano */
};
El uso de la estructura timezone es obsoleto; el campo
tz_dsttime nunca
ha sido utilizado en Linux - no lo ha sido y nunca será soportado por
libc o glibc. Todas y cada una de las ocurrencias de este campo en el fuente
del núcleo (distintas de la declaración) son un fallo. Por
tanto, lo siguiente es puramente de interés histórico.
El campo
tz_dsttime contiene una constante simbólica (los valores
se dan más abajo) que indica en qué parte del año la
`correción horaria invierno/verano' (Daylight Saving Time, DST,
también conocida como `horario de ahorro energético')
está en vigor. (Nota: su valor es constante a lo largo del año -
no indica si DST está o no en vigor, sólo selecciona un
algoritmo). Los algoritmos de corrección horaria invierno/verano se
definen como sigue:
DST_NONE /* no hay */
DST_USA /* estilo EE.UU. */
DST_AUST /* estilo australiano */
DST_WET /* como en Europa Occidental */
DST_MET /* como en Europa Central */
DST_EET /* como en Europa del Este */
DST_CAN /* Canadá */
DST_GB /* Gran Bretaña e Irlanda */
DST_RUM /* Rumanía */
DST_TUR /* Turquía */
DST_AUSTALT /* est. australiano con cambio en 1986 */
Naturalmente, resultó ser que el periodo en el que la corrección
horaria invierno/verano está en vigor no se podía dar mediante
un simple algoritmo, uno por país: de hecho, este periodo se determina
por decisiones políticas impredecibles. Por tanto, este método
de representación de las zonas horarias se ha abandonado. Bajo Linux,
en una llamada a
settimeofday el campo
tz_dsttime debe ser cero.
Bajo Linux hay algunas semánticas de `Warp clock' peculariares asociadas
a la llamada al sistema
settimeofday si en la primera llamada de todas
(después del arranque) que tenga un argumento
tz no NULL, el
argumento
tv es NULL y el campo
tz_minuteswest es no cero. En
tal caso, se asume que el reloj CMOS está en el horario local y que
tiene que ser incrementado en esta cantidad para obtener el horario del
sistema UTC. No cabe duda que usar esta característica es una mala
idea.
Para operar sobre la estructura timeval se definen las siguientes macros:
#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 o
tz es nulo, la estructura correspondiente no se ajusta ni
se devuelve.
Solamente el super-usuario puede emplear
settimeofday.
VALOR DEVUELTO¶
gettimeofday y
settimeofday devuelven 0 en caso de éxito
ó -1 si ocurre un fallo (en cuyo caso
errno toma un valor
apropiado).
ERRORES¶
- EPERM
- Alguien que no es el super-usuario ha llamado a settimeofday
- EINVAL
- La zona horaria (o algo más) es inválida.
- EFAULT
- Uno de tv o tz apuntaba afuera de su espacio de direcciones
accesible.
SVr4, BSD 4.3
VÉASE TAMBIÉN¶
date(1),
adjtimex(2),
time(2),
ctime(3),
ftime(3)