Я ожидаю, что gettimeofday()
вызовет системный вызов, чтобы выполнить работу, фактически получая время. Однако, выполнив следующую программуПолучает ли gettimeofday() на macOS системный вызов?
#include <stdlib.h>
#include <sys/time.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
struct timeval tv;
printf("Before gettimeofday() %ld!\n", tv.tv_sec);
int rc = gettimeofday(&tv, NULL);
printf("After gettimeofday() %ld\n", tv.tv_sec);
if (rc == -1) {
printf("Error: gettimeofday() failed\n");
exit(1);
}
printf("Exiting ! %ld\n", tv.tv_sec);
return 0;
}
под dtruss -d
возвращает длинный список системных вызовов, последний из которых являются:
RELATIVE SYSCALL(args) = return
... lots of syscalls with earlier timestamps ...
3866 fstat64(0x1, 0x7FFF56ABC8D8, 0x11) = 0 0
3868 ioctl(0x1, 0x4004667A, 0x7FFF56ABC91C) = 0 0
3882 write_nocancel(0x1, "Before gettimeofday() 0!\n\0", 0x19) = 25 0
3886 write_nocancel(0x1, "After gettimeofday() 1480913810\n\0", 0x20) = 32 0
3887 write_nocancel(0x1, "Exiting ! 1480913810\n\0", 0x15) = 21 0
Похоже gettimeofday()
не использует системный вызов, но это, кажется, неправильно - конечно, ядро отвечает за системные часы? Есть dtruss
что-то отсутствует? Я читаю выход неправильно?
В Solaris 'gettimeofday()' просто считывает местоположение памяти. Вполне возможно, что что-то похожее на macOS Sierra (или предыдущие версии Mac OS X). Вам может быть интересно или не интересно, что macOS Sierra (но не более ранние версии) поддерживает 'clock_gettime()' в конце концов. –
Вы можете увидеть системный вызов 'gettimeofday()' в [исходный код] (https://opensource.apple.com/source/xnu/xnu-3789.1.32/bsd/kern/syscalls.master.auto.html) - # 116 – TheDarkKnight
В Linux системный вызов, например 'gettimeofday()', может быть реализован как * нормальный вызов функции и несколько обращений к памяти "*: [vDSO] (http://man7.org/linux/ man-pages/man7/vdso.7.html) – jfs