Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用settimeofday(2)?_C_Linux_Posix_Glibc - Fatal编程技术网

C 如何使用settimeofday(2)?

C 如何使用settimeofday(2)?,c,linux,posix,glibc,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

我做错了什么?我希望
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
正如预期的那样,如果我以普通用户身份运行该程序,我将获得EPERM not EINVAL:

$ ./a.out 
settimeofday: Operation not permitted

如settimeofday()的手册页所示

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


如settimeofday()的手册页所示

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

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

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

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


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

请注意,您需要获得
settimeofday
的权限,而不是如果您不是以root用户身份运行,它应该返回
EINVAL
错误。您应该是sudo用户或root用户,默认情况下,普通用户不允许更改时间参见“sudo./a.out”中的“sudo”。该命令正在以root用户身份运行。对于我来说,使用相同的代码,它在某些系统上运行得非常好,在某些安全设置下,即使超级用户也无法使用
settimeofday()
——这是Fedora做的吗?请注意,您需要获得
settimeofday
的权限,如果您不是以root用户身份运行,则不应返回
EINVAL
错误。您应该是sudo用户或root用户,默认情况下,普通用户不允许更改时间请参见“sudo./a.out”中的“sudo”。该命令正在以root用户身份运行。对于我来说,使用相同的代码,它在某些系统上运行得非常好,在某些安全设置下,即使超级用户也无法使用
settimeofday()
——这是Fedora做的吗?下面几行写着:
时区结构的使用已经过时;tz参数通常应指定为NULL。
@John Hascall,在完全读取setimeofday()的手册页后,linux似乎不支持时区的TZdstTime,但仍需要设置tz_minuteswest字段。我不确定我读的是否正确。许多著名的例子(如Robert Love的Linux系统编程)显示了settimeofday()与第二个参数设置为NULL一起使用。此外,我还尝试传入一个非空的时区结构,结果没有什么不同。似乎禁止您将电视设置为{0,0},即大纪元时间的开始。如中所述,使用adjtime(如下)平稳过渡@joshuajohnson,这是设置电视到{0,0}的结果,下面几行写着:
时区结构的使用已经过时;tz参数通常应指定为NULL。
@John Hascall,在完全读取setimeofday()的手册页后,linux似乎不支持时区的TZdstTime,但仍需要设置tz_minuteswest字段。我不确定我读的是否正确。许多著名的例子(如Robert Love的Linux系统编程)显示了settimeofday()与第二个参数设置为NULL一起使用。此外,我还尝试传入一个非空的时区结构,结果没有什么不同。似乎禁止您将电视设置为{0,0},即大纪元时间的开始。如中所述,使用adjtime(如下)将@JoshuaJohnson平稳过渡到设置电视的结果{0,0}:
$ ./a.out 
settimeofday: Operation not permitted