2.7.8 例: プログラムが10秒で異なるファイルから読み取られた回数のカウント(fdscount.d)

次のDプログラムは、プログラムが異なるファイルから読み取る回数を10秒以内にカウントし、上位5件の結果のみを表示します。

# emacs fdscount.d
# dtrace -C -D ENAME='"emacs"' -qs fdscount.d

  /usr/share/terminfo/x/xterm                                       2
  /dev/urandom                                                      3
  /usr/share/emacs/24.3/lisp/calendar/time-date.elc                 5
  /dev/tty                                                          8
  /usr/share/emacs/24.3/lisp/term/xterm.elc                         8

fds[]組込み配列を使用して、read()へのファイル記述子引数arg0に対応するファイルを判別します。 fds[] by arg0で索引付けされるfileinfo_t構造体のfi_pathnameメンバーには、ファイルのフルパス名が含まれます。

fileinfo_t構造のメンバーの詳細は、Oracle® Linux: DTraceガイドfileinfo_tを参照してください。

ENDアクションのtrunc()関数は、集計の上位5つの結果のみを表示するようにDTraceに指示します。

DTraceは、profile:::tick-10sプローブ、fds[]組込み配列およびsyscall::read:entryプローブにアクセスできます。 Cプリプロセッサ・ディレクティブをdtrace に指定して、ENAME変数の値(emacsなど)を設定します。 ただし、任意の実行可能ファイルを選択できます。 文字列引用符をエスケープするには、次のように、さらに一重引用符を使用する必要があります:

# dtrace -C -D ENAME='"emacs"' -qs fdscount.d

/usr/share/terminfo/x/xterm 2
/dev/tty 3
/dev/urandom 3
/usr/share/emacs/24.3/lisp/calendar/time-date.elc 5
/usr/share/emacs/24.3/lisp/term/xterm.elc 8

テスト下の実行可能ファイルで出力に/proc/pid/mapsエントリが表示される場合は、プロセスのマップ済メモリー・リージョンと権限に関する情報が含まれるprocfsファイル・システムのファイルを参照します。 pipe:inodeおよびsocket:inodeエントリを表示すると、pipefsおよびsocketfsファイル・システムではinodesを参照します。