D コンパイラには、D プログラムやインタプリタファイルの作成時に使用できる組み込みマクロ変数のセットが定義されています。マクロ変数は、ドル記号 ($) で始まる識別子です。D コンパイラは、入力ファイルの処理時に、この変数を 1 回だけ展開します。以下に、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 コマンドによって実行されるものを除くすべてのシステムコールをカウントしたい場合は、以下の例のように、D プログラム節に $pid を指定します。
syscall:::entry /pid != $pid/ { @calls = count(); }
dtrace コマンドを呼び出すたびにプロセス ID は変化しますが、この節は、常に望ましい結果を返します。
マクロ変数は、D プログラム内の整数、識別子、または文字列の代わりに使用できます。マクロ変数は、入力ファイルの解析時に 1 回だけ (非再帰的に) 展開されます。各マクロ変数は、展開後、独立した入力トークンになります。これらを何らかのテキストと連結して 1 つのトークンにすることはできません。たとえば、$pid の展開後の値が 456 であるとして、次の D コードについて考えてみましょう。
123$pid
この D コードを展開すると、123 と 456 の 2 つのトークンが隣接する結果になり、構文エラーが返されます。単一の整数トークン 123456 が得られるわけではありません。
展開後のマクロ変数は、プログラム節の冒頭の D プローブ記述内では、隣接テキストと連結されます。たとえば、以下の節では、DTrace プロバイダ pid を使って dtrace コマンドを計測できます。
pid$pid:libc.so:printf:entry { ... }
マクロ変数は、各プローブ記述フィールド内で 1 回だけ展開されます。プローブ記述の区切り文字 (:) を含めることはできません。