FILEMON(4) | FreeBSD Kernel Interfaces Manual | FILEMON(4) |
名称
filemon — filemon デバイス書式
#include < dev/filemon/filemon.h>解説
filemon デバイスによって、プロセスは、その複数の子どものファイル操作データを集めることができます。デバイス /dev/filemon は、2 つの ioctl(2) 呼び出しに応答します。システムコールは、次の単一文字を使用して表示されます:
-
‘
C
’ - chdir(2)
-
‘
D
’ - unlink(2)
-
‘
E
’ - exec(2)
-
‘
F
’ - fork(2), vfork(2)
-
‘
L
’ - link(2), linkat(2), symlink(2), symlinkat(2)
-
‘
M
’ - rename(2)
-
‘
R
’ - 読み込みのための open(2)
-
‘
S
’ - stat(2)
-
‘
W
’ - 書き込みのための open(2)
-
‘
X
’ - _exit(2)
‘ R
’に続く‘ W
’レコードは、R/W のための単一の open(2) または‘ R
’のための 1 つ、‘ W
’のための 1 つの 2 つの個別の open(2) 呼び出しを表わすことができることに注意してください。成功したシステムコールだけが捕獲 (capture) されることに注意してください。
IOCTL
ユーザモードのプログラムは、下記に記述されている多くの ioctl を通して filemon ドライバと通信します。各々は、単一の引数を取ります。- FILEMON_SET_FD
- 供給されたオープンファイル記述子に内部のトレースバッファを書き込みます。
- FILEMON_SET_PID
- トレースする子プロセスの ID。
戻り値
ioctl() 関数は、成功するなら、値 0 を返します。そうでなければ、値-1 が返され、グローバル変数 errno は、エラーを示す値が設定されます。関連ファイル
- /dev/filemon
使用例
#include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <sys/ioctl.h> #include <dev/filemon/filemon.h> #include <fcntl.h> #include <err.h> #include <unistd.h> static void open_filemon(void) { pid_t child; int fm_fd, fm_log; if ((fm_fd = open("/dev/filemon", O_RDWR | O_CLOEXEC)) == -1) err(1, "open(\"/dev/filemon\", O_RDWR)"); if ((fm_log = open("filemon.out", O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC, DEFFILEMODE)) == -1) err(1, "open(filemon.out)"); if (ioctl(fm_fd, FILEMON_SET_FD, &fm_log) == -1) err(1, "Cannot set filemon log file descriptor"); if ((child = fork()) == 0) { child = getpid(); if (ioctl(fm_fd, FILEMON_SET_PID, &child) == -1) err(1, "Cannot set filemon PID"); /* ここで何かを行います. */ } else { wait(&child); close(fm_fd); } }
filemon.out と名前を付けられたファイルを作成し、それに filemon バッファの内容を書き込むために filemon デバイスを設定します。
歴史
filemon デバイスは、 FreeBSD 9.1 で登場しました。June 14, 2013 | FreeBSD |