【发布时间】:2021-07-26 18:58:05
【问题描述】:
如果我编译以下程序:
$ cat main.cpp && g++ main.cpp
#include <time.h>
int main() {
struct timespec ts;
return clock_gettime(CLOCK_MONOTONIC, &ts);
}
然后在“标准”Kubuntu 中的strace 下运行它,我明白了:
strace -tt --trace=clock_gettime ./a.out
17:58:40.395200 +++ exited with 0 +++
如您所见,没有clock_gettime(完整的strace 输出为here)。
另一方面,如果我在 qemu 下自定义构建的 linux 内核中运行相同的应用程序,我会得到以下输出:
strace -tt --trace=clock_gettime ./a.out
18:00:53.082115 clock_gettime(CLOCK_MONOTONIC, {tv_sec=101481, tv_nsec=107976517}) = 0
18:00:53.082331 +++ exited with 0 +++
哪个更值得期待 - 有 clock_gettime。
所以,我的问题是:
- 如果我在 Kubuntu 中运行
strace,为什么会忽略/忽略clock_gettime? - 为什么
strace的行为因环境/内核而异?
【问题讨论】:
-
只是一个想法:第一个示例中没有系统调用。手册页告诉 CLOCK_MONOTONIC_COARSE 将使用 vdso,但可能以后的 glibc 也可能能够优化您的函数以不调用内核(使用系统调用)。 GUI 可能会经常使用此类计时功能,因此任何优化都是显而易见的
-
是的,有道理。您能否将这个“CLOCK_MONOTONIC_COARSE 将使用 vdso,但可能以后的 glibc 也可以优化您的函数以不调用内核(使用系统调用)”作为答案? :) 本质上,问题是系统调用何时不是“正确的”系统调用,以及它依赖于什么......
标签: linux linux-kernel system-calls strace