¿Qué estoy haciendo mal aquí? Espero que settimeofday()
cambie la hora del sistema, no devuelva EINVAL
.
$ uname -a Linux io 4.3.5-300.fc23.x86_64 #1 SMP Mon Feb 1 03:18:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux $ cat settimeofday.c #include <sys/time.h> #include <stdio.h> int main() { struct timeval tv = {0, 0}; if (settimeofday(&tv, 0) == -1) perror("settimeofday"); } $ gcc settimeofday.c $ sudo ./a.out settimeofday: Invalid argument
El error proviene de un Thinkpad T450 que ejecuta Fedora 23. El mismo código funciona bien en OS X.
EDITAR
Para aclarar, el comando se ejecuta como root:
# whoami root # sudo ./a.out settimeofday: Invalid argument
Como era de esperar, obtengo EPERM no EINVAL si ejecuto el programa como un usuario normal:
$ ./a.out settimeofday: Operation not permitted
Commit e1d7ba se introdujo en el kernel de Linux a mediados de 2015 y restringe el valor del campo tv_sec. La restricción está influenciada por el tiempo de actividad del sistema; consulte el mensaje de confirmación y la discusión de LKML relacionada para obtener más detalles.
Eso es lo que estaba causando que la llamada settimeofday
devolviera EINVAL
y explica por qué el código se ejecuta en OS X y máquinas Linux más antiguas.
Como se muestra en la página de manual de settimeofday().
Si tv o tz es NULL, la estructura correspondiente no se establece ni se devuelve.