【问题标题】:When could a call to time(NULL) fail on Linux什么时候在 Linux 上调用 time(NULL) 会失败
【发布时间】:2009-10-15 11:59:26
【问题描述】:

根据本文档http://www.cplusplus.com/reference/clibrary/ctime/time/

for time(NULL) "如果函数无法检索日历时间,则返回 -1 值。"

这是我应该在我的代码中检查的内容吗?如果 time(NULL) 没有检索时间,那么肯定有什么地方出了问题。

【问题讨论】:

  • 严重停电或计算机崩溃时... ;) ...您将其放在 finally 块中对吗?

标签: c time


【解决方案1】:

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

glibc 源代码声称 time syscall 在 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 何时为 NULL。
    【解决方案3】:

    你有一个叫做系统时钟的东西。如果它被破坏了,那么这将失败,尽管可能有许多其他原因。

    【讨论】:

    • 系统时钟怎么会“破”?我已经看到它失去了时间,赢得了时间,并且表现异常。但我从未见过它根本不起作用。
    • 参考 atomice 的帖子:如果你用它来表示 --- nds (www.devkitpro.com) 那么它 CAN(拒绝投票者自己解释)
    【解决方案4】:

    最明显的情况是内部时钟需要外部初始化(例如使用 NTP)的系统。在这发生之前,内部时钟不能给出与历元相关的值,尽管它可以用来测量间隔。 time_t 是 epoch-relative,因此 time(NULL) 在这种情况下必须失败。

    【讨论】:

    • 不会 time(NULL) 在这里给出错误的答案吗?而不是失败并返回 -1?
    • 不,如果实施得当,则不会。这是很合理的。考虑一个实现/dev/time/ deivce 的操作系统,它在读取时会给出当前时间。在初始化之前,您会在设备上收到读取错误。调用 time() 时,标准 C 库会传递该故障
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多