在Linux上,调用time(NULL)什么时候会失败?

7
根据这份文档http://www.cplusplus.com/reference/clibrary/ctime/time/,对于time(NULL),如果函数无法检索到日历时间,则返回-1值。在我的代码中是否应该检查这个呢?如果time(NULL)无法检索到时间,肯定是出了什么大问题了。

当出现严重的停电或计算机崩溃时... ;) ...你会把它放在finally块中,对吧? - aviraldg
4个回答

17

你可能正在运行没有实时时钟的嵌入式设备。

glibc源代码声称在Linux上时间系统调用不会失败:

 time_t res = INTERNAL_SYSCALL (time, err, 1, NULL);
  /* There cannot be any error.  */

如果你查看内核源代码,确实是这种情况:

SYSCALL_DEFINE1(time, time_t __user *, tloc)
{
        time_t i = get_seconds();

        if (tloc) {
                if (put_user(i,tloc))
                        return -EFAULT;
        }
        force_successful_syscall_return();
        return i;
}

2
Ubuntu手册中提到,time(2) 可能由于 EFAULT("t 指向的地址位于不可访问的地址空间之外")导致失败。
OSX手册中说它可能因为与gettimeofday相同的原因而失败,这些原因是 EFAULTEPERM(不确定它如何应用于 time)。
因此,根据上述系统的文档,它不会因为 NULL 参数而失败。
此外,POSIX并未指定此函数的任何错误条件。

问题是关于 t 为空时的情况。 - Eugene Bujak

0
你有一个叫做系统时钟的东西。如果它出了问题,那么这个程序将会失败,虽然也可能有其他原因。

系统时钟如何“损坏”?我见过它失去时间,获得时间和异常行为。但我从未见过它完全无法工作。 - Thomas Owens
参考atomice的帖子: 如果你用这个来编写nds程序(www.devkitpro.com),它*可以*(请反对者解释一下) - aviraldg

0

一个明显的情况是,系统的内部时钟需要外部初始化(例如使用NTP)。 在此之前,内部时钟无法提供相对于纪元的值,尽管它可以用于测量间隔。 time_t 是相对于纪元的,因此在这种情况下必须使 time(NULL) 失败。


time(NULL) 在这里会不会给出错误的答案?与其失败并返回 -1? - Managu
不,如果它被正确实现的话就不会。这是相当合理的。考虑一个实现了/dev/time/设备的操作系统,当读取该设备时会给出当前时间。在初始化之前,您将在设备上获得读取错误。标准的C库在调用time()时会传递这个失败信息。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接