与 shell 和实用程序(如 awk(1) 和 perl(1))类似,可使用 dtrace(1M) 创建可执行的解释程序文件。解释程序文件的起始行格式如下所示:
#! pathname arg
其中,pathname 是解释程序的路径,arg 是单个可选参数。执行解释程序文件时,系统将调用指定的解释程序。如果解释程序文件中指定了 arg,则会将其作为参数传递到解释程序。解释程序文件本身的路径和执行该文件时指定的任何其他参数,随后将附加到解释程序参数列表。因此,将始终需要创建至少带有以下参数的 DTrace 解释程序文件:
#!/usr/sbin/dtrace -s
执行解释程序文件时,-s 选项的参数将成为解释程序文件本身的路径名。然后 dtrace 将读取、编译和执行此文件,作用与在 shell 中键入以下命令类似:
# dtrace -s interpreter-file |
以下示例说明如何创建和执行 dtrace 解释程序文件。键入以下 D 源代码,并将其保存在名为 interp.d 的文件中:
#!/usr/sbin/dtrace -s BEGIN { trace("hello"); exit(0); }
将 interp.d 文件标记为可执行文件,并按以下方式执行该文件:
# chmod a+rx interp.d # ./interp.d dtrace: script './interp.d' matched 1 probe CPU ID FUNCTION:NAME 1 1 :BEGIN hello # |
请记住,#! 指令必须是文件的前两个字符,中间或前面都不得有空格。D 编译器在处理解释程序文件时会自动忽略此行。
dtrace 使用 getopt(3C) 处理命令行选项,以便于将多个选项合并为单个解释程序参数。例如,要将 -q 选项添加到前面的示例中,可以将解释程序指令更改为:
#!/usr/sbin/dtrace -qs
如果指定多个选项字母,则必须始终用 -s 选项结束布尔选项列表,以便将下一个参数(解释程序文件名)作为与 -s 选项对应的参数进行处理。
如果需要在解释程序文件中指定多个要求参数的选项,则不能将所有选项和参数放入单个解释程序参数中。请改为使用 #pragma D option 指令语法设置这些选项。所有 dtrace 命令行选项都有可以使用的 #pragma 等效选项,如第 16 章中所示。