开发者

When could a call to time(NULL) fail on Linux

开发者 https://www.devze.com 2022-12-08 08:56 出处:网络
According to this documentation http://www.cplusplus.com/reference/clibrary/ctime/time/ for time(NULL) \"If the function could not retrieve the calendar time, it re开发者_运维百科turns a -1 value.\"

According to this documentation http://www.cplusplus.com/reference/clibrary/ctime/time/

for time(NULL) "If the function could not retrieve the calendar time, it re开发者_运维百科turns a -1 value."

Is this something I should check for in my code? Surely something has got to be going pretty wrong if time(NULL) is not retrieving the time.


You may be running on an embedded device that doesn't have a real-time clock.

The glibc source code claims that the time syscall can't fail on Linux:

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

and indeed this is the case if you look at the kernel source:

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;
}


Ubuntu man page says time(2) can fail due to EFAULT ("t points outside your accessible address space").

OSX man page says it can fail for the same reasons as gettimeofday, which are EFAULT and EPERM (not sure how this applies to time).

Therefore, it cannot fail for the argument of NULL, according to the documentation of aforementioned systems.

Also, POSIX specifies no error conditions at all for this function.


You have something called a system clock. If that's broken, then this will fail, though there could be many other reasons.


The obvious case would be a system whose internal clock requires external initialization (using eg. NTP). Until this has happened, the internal clock cannot give epoch-relative values, although it can be used to measure intervals. time_t is epoch-relative and therefore time(NULL) must fail in this case.

0

精彩评论

暂无评论...
验证码 换一张
取 消