我預計gettimeofday()
會調用系統調用來完成實際獲得時間的工作。但是,運行下面的程序macOS上的gettimeofday()是否使用系統調用?
#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