2

我正在尝试使用脚本使用(例如)类型的printf一些Solaris内核级信息。如何在我的代码中安全准确地打印。uint64_ttimestampDTraceuint64_tDTrace

我知道用 C 打印的正确方法uint64_t是:

#define __STDC_FORMAT_MACROS
#include <sys/inttypes.h> //sys: Kernel level

uint64_t timestamp;
printf("%"PRIu64"\n", timestamp);

DTraceD中的等价物是什么?(%d和 `%llu 是不精确和危险的)。

注意不要与其他名为“D”的编程语言(由 Walter Bright 开发的类似 C++ 的编程语言)混淆。

4

1 回答 1

1

根据DTrace Wiki:输出格式

D 编译器不需要在 printf 格式转换中使用大小前缀。C printf 例程要求您通过添加前缀来指示参数的大小,例如 %ld 表示 long 或 %lld 表示 long long。D 编译器知道参数的大小和类型,因此在 D printf 语句中不需要这些前缀。

此外,D 中的%dand%i格式将处理有符号或无符号整数,因此您可以使用 、 或 中的任何%d一个%i%u打印以 10 为底的无符号整数值,所有结果都相同。

OP 在评论中询问了%Y格式。这可用于包含自 1970 年 1 月 1 日以来的纳秒数的 uint64_t 值,例如内置的walltimestamp变量。(timestamp并且vtimestamp那个时代开始计算。)

uint64_t 参数被解释为自 1970 年 1 月 1 日世界协调时间 00:00 起的纳秒数,并以以下 cftime(3C) 格式打印:“%Y %a %b %e %T %Z。 "

于 2015-07-14T20:08:26.333 回答