Tôi hy vọng rằng gettimeofday()
sẽ gọi một cuộc gọi hệ thống để thực hiện công việc thực sự nhận được thời gian. Tuy nhiên, chạy chương trình sauGettimeofday() trên macOS có sử dụng cuộc gọi hệ thống không?
#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;
}
dưới dtruss -d
trả về một danh sách dài các cuộc gọi hệ thống, người cuối cùng trong số đó là:
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
Dường như gettimeofday()
không sử dụng một syscall, nhưng điều này dường như sai-chắc chắn hạt nhân chịu trách nhiệm của các đồng hồ hệ thống? dtruss
có thiếu gì đó không? Tôi có đọc kết quả không chính xác không?
Trên Solaris, 'gettimeofday()' chỉ cần đọc vị trí bộ nhớ. Nó cũng có thể là có một cái gì đó tương tự đang xảy ra với macOS Sierra (hoặc các phiên bản Mac OS X trước). Bạn có thể hoặc có thể không quan tâm để lưu ý rằng macOS Sierra (nhưng không phải phiên bản trước đó) hỗ trợ 'clock_gettime()' lâu dài nhất. –
Bạn có thể thấy cuộc gọi hệ thống 'gettimeofday()' trong [mã nguồn] (https://opensource.apple.com/source/xnu/xnu-3789.1.32/bsd/kern/syscalls.master.auto.html) - # 116 – TheDarkKnight
Trên Linux, một cuộc gọi hệ thống như 'gettimeofday()' có thể được thực hiện như một cuộc gọi chức năng bình thường * và một vài truy cập bộ nhớ "*: [vDSO] (http://man7.org/linux/ man-pages/man7/vdso.7.html) – jfs