- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
C11
标准提供函数 timespec_get
.如果我在 cppreference 或我的计算机上运行示例代码,它会工作:
#include <stdio.h>
#include <time.h>
int main(void)
{
struct timespec ts;
timespec_get(&ts, TIME_UTC);
char buff[100];
strftime(buff, sizeof buff, "%D %T", gmtime(&ts.tv_sec));
printf("Current time: %s.%09ld UTC\n", buff, ts.tv_nsec);
}
但是,如果我查看 glibc 的源代码 here ,代码如下:
#include <time.h>
/* Set TS to calendar time based in time base BASE. */
int
timespec_get (struct timespec *ts, int base)
{
switch (base)
{
case TIME_UTC:
/* Not supported. */
return 0;
default:
return 0;
}
return base;
}
stub_warning (timespec_get)
哪个...不应该工作...
由此引出一个问题:真正调用的timespec_get
的源码在哪里?
最佳答案
timespec_get
函数的实现取决于库运行的系统,因此它在 time/timespec_get.c
中显示为 stub (如果没有实现是可用)以及其他地方的各种依赖于系统的实现。
你可以在sysdeps/unix/sysv/linux/timespec_get.c
中看到Linux实现,
/* Set TS to calendar time based in time base BASE. */
int
timespec_get (struct timespec *ts, int base)
{
switch (base)
{
int res;
INTERNAL_SYSCALL_DECL (err);
case TIME_UTC:
res = INTERNAL_VSYSCALL (clock_gettime, err, 2, CLOCK_REALTIME, ts);
if (INTERNAL_SYSCALL_ERROR_P (res, err))
return 0;
break;
default:
return 0;
}
return base;
}
这只是一个 vDSO 调用的薄包装,vDSO 是 Linux 内核本身的一部分。如果您好奇,请在此处查找 clock_gettime
的定义。 clock_gettime
在 vDSO 中是不常见的,只有少数系统调用是这样实现的。
这是 CLOCK_REALTIME
的 x86 实现,可在 arch/x86/entry/vdso/vclock_gettime.c
中找到:
/* Code size doesn't matter (vdso is 4k anyway) and this is faster. */
notrace static int __always_inline do_realtime(struct timespec *ts)
{
unsigned long seq;
u64 ns;
int mode;
do {
seq = gtod_read_begin(gtod);
mode = gtod->vclock_mode;
ts->tv_sec = gtod->wall_time_sec;
ns = gtod->wall_time_snsec;
ns += vgetsns(&mode);
ns >>= gtod->shift;
} while (unlikely(gtod_read_retry(gtod, seq)));
ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
ts->tv_nsec = ns;
return mode;
}
基本上,您的进程中有一些内存由内核更新,而您的 CPU 中有一些寄存器跟踪时间的流逝(或您的管理程序提供的东西)。您进程中的内存用于将这些 CPU 寄存器的值转换为挂钟时间。您必须在循环中读取它们,因为它们在您读取它们时可能会发生变化……当您读取错误时,循环逻辑会检测到这种情况,然后重试。
关于c - 哪里可以找到timespec_get的源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51489703/
根据C11标准(7.27.2.5),在time.h中指定了一个函数timespec_get。试过好几个编译器,包括clang和gcc的好几个版本,应该是支持C11的,但是总是缺少这个功能。宏 TIME
以下代码片段: struct timespec ts; for (int x = 0; x = 3000000不会出现问题.该问题依赖于小于 3000000 的纳秒。 最佳答案 原因是,您(隐式)使用
在计时功能中,time , clock getrusage , clock_gettime , gettimeofday和 timespec_get ,我想清楚地了解它们是如何实现的以及它们的返回值是
我是一名优秀的程序员,十分优秀!