我在这里做错了什么?我希望settimeofday()
更改系统时间,而不是返回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
错误来自运行Fedora 23的Thinkpad T450。相同的代码在OS X上运行良好。
修改
为了澄清,该命令正在以root身份执行:
# whoami
root
# sudo ./a.out
settimeofday: Invalid argument
正如预期的那样,如果我以常规用户身份运行程序,我会获得EPERM而不是EINVAL:
$ ./a.out
settimeofday: Operation not permitted
答案 0 :(得分:2)
在2015年中期,Linux内核引入了提交e1d7ba,并限制了tv_sec字段的值。限制受系统正常运行时间的影响 - 有关详细信息,请参阅提交消息和相关的LKML讨论。
这是导致settimeofday
调用返回EINVAL
的原因,并解释了代码在OS X和旧Linux机器上运行的原因。
答案 1 :(得分:0)
如settimeofday()的联机帮助页所示。
如果tv或tz为NULL,则不设置或返回相应的结构。