如何使用settimeofday(2)?

时间:2016-02-12 02:24:33

标签: c linux posix glibc

我在这里做错了什么?我希望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

2 个答案:

答案 0 :(得分:2)

在2015年中期,Linux内核引入了提交e1d7ba,并限制了tv_sec字段的值。限制受系统正常运行时间的影响 - 有关详细信息,请参阅提交消息和相关的LKML讨论。

这是导致settimeofday调用返回EINVAL的原因,并解释了代码在OS X和旧Linux机器上运行的原因。

答案 1 :(得分:0)

如settimeofday()的联机帮助页所示。

  

如果tv或tz为NULL,则不设置或返回相应的结构。