D 编译器定义了一组内置的宏变量,可以在编写 D 程序或解释程序文件时使用这些变量。宏变量是以美元符号 ($) 作为前缀的标识符,并在处理输入文件时由 D 编译器扩展一次。D 编译器提供了以下宏变量:
表 15–1 D 宏变量
名称 |
说明 |
参考 |
---|---|---|
$[0-9]+ |
宏参数 |
请参见宏参数 |
$egid |
有效组 ID | |
$euid |
有效用户 ID | |
$gid |
实际组 ID | |
$pid |
进程 ID | |
$pgid |
进程组 ID | |
$ppid |
父进程 ID | |
$projid |
项目 ID | |
$sid |
会话 ID | |
$target |
目标进程 ID |
请参见目标进程 ID |
$taskid |
任务 ID | |
$uid |
实际用户 ID |
除了 $[0-9]+ 宏参数和 $target 宏变量以外,所有宏变量都扩展为与系统属性(如进程 ID 和用户 ID)对应的整数。变量扩展为与当前 dtrace 进程本身或正在运行 D 编译器的任何进程关联的属性值。
通过在解释程序文件中使用宏变量,可以创建持久性的 D 程序,每次使用这些程序时无需对其进行编辑。例如,要统计除 dtrace 命令执行的系统调用以外的所有系统调用,可以使用包含 $pid 的以下 D 程序子句:
syscall:::entry /pid != $pid/ { @calls = count(); }
即使每次调用 dtrace 命令都将得到不同的进程 ID,此子句也始终会生成所需的结果。
D 程序中可使用整数、标识符或字符串的任何位置均可使用宏变量。在解析输入文件时,将只扩展宏变量一次(即,不递归扩展)。每个扩展的宏变量形成一个单独的输入标记,不能与其他文本串联生成单个标记。例如,如果 $pid 扩展为值 456,则 D 代码:
123$pid
将扩展为两个相邻的标记 123 和 456,这将导致语法错误,而不会生成单个整数标记 123456。
宏变量在程序子句的开始位置扩展,并与 D 探测器说明内部的相邻文本串联。例如,以下子句使用 DTrace pid 提供器检测 dtrace 命令:
pid$pid:libc.so:printf:entry { ... }
宏变量在每个探测器说明字段中仅扩展一次;它们不得包含探测器说明分界符 (:)。