Почему не время() вызывает системный вызов?

Когда я "трассирую" следующую программу на C, time() не вызывает системный вызов.

#include <time.h>
int main() {
  return (int)time(NULL);
}

Почему бы и нет? Откуда у него время суток? Вот полный вывод strace на Ubuntu 12.04.

$ gcc -Wall -o testtime testtime.c && strace ./testtime
execve("./testtime", ["./testtime"], [/* 34 vars */]) = 0
brk(0)                                  = 0x11f1000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd6e052f000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=38828, ...}) = 0
mmap(NULL, 38828, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd6e0525000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\30\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1815224, ...}) = 0
mmap(NULL, 3929304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fd6dff4f000
mprotect(0x7fd6e0104000, 2097152, PROT_NONE) = 0
mmap(0x7fd6e0304000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b5000) = 0x7fd6e0304000
mmap(0x7fd6e030a000, 17624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fd6e030a000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd6e0524000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd6e0523000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd6e0522000
arch_prctl(ARCH_SET_FS, 0x7fd6e0523700) = 0
mprotect(0x7fd6e0304000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ)     = 0
mprotect(0x7fd6e0531000, 4096, PROT_READ) = 0
munmap(0x7fd6e0525000, 38828)           = 0
exit_group(1407260210)                  = ?

Ответ 1

Вероятно, это связано с тем, что time() реализуется через виртуальный динамический общий объект (VDSO). Это используется для повышения эффективности системных вызовов, которые просто считывают крошечный объем данных из ядра. Типичным примером является gettimeofday().

Для получения дополнительной информации вы можете обратиться к этой статье с LWN Анатомия системного вызова, часть 2, раздел gettimeofday(): vDSO.