KVM_GETPROCS(3)

名称
kvm_getprocs, kvm_getargv, kvm_getenvv - ユーザプロセス状態にアクセスする

ライブラリ
libkvm

書式
<kvm.h> <sys/param.h> <sys/sysctl.h> struct kinfo_proc * kvm_getprocs(kvm_t *kd, int op, int arg, int *cnt) char ** kvm_getargv(kvm_t *kd, const struct kinfo_proc *p, int nchr) char ** kvm_getenvv(kvm_t *kd, const struct kinfo_proc *p, int nchr)

解説
kvm_getprocs() は kd が指示するカーネルの動作中のプロセスの (サブ) 集合を返します。 op と arg の引数は,返されるプロセスの集合を制限する属性を構成します。 op の値は以下のフィルタリング属性を記述しています :

KERN_PROC_ALL
    すべてのプロセス
KERN_PROC_PID
    プロセス ID arg を持つプロセス
KERN_PROC_PGRP
    プロセスグループ arg を持つプロセス
KERN_PROC_SESSION
    セッション arg を持つプロセス
KERN_PROC_TTY
    tty arg を持つプロセス
KERN_PROC_UID
    実効ユーザ ID arg を持つプロセス
KERN_PROC_RUID
    実ユーザ ID arg を持つプロセス

見つけたプロセス数は参照パラメータ cnt で返されます。 プロセスは kinfo_proc 構造体の連続配列として返されます。 このメモリは局所的に割り当てられ、 kvm_getprocs() と kvm_close() に引き続く呼び出しはこの記憶域に上書きします。

kvm_getargv() はヌルで終了する引数ベクタを返します。 このベクタは p が示すプロセスに渡されたコマンドライン引数に対応します。 おそらく、これらの引数はプロセス生成時の exec(3) に渡された値に相当します。 しかしながら、この情報は、 故意にプロセス自身のコントロール下にあります。 オリジナルのコマンド名は、 kvm_getprocs() によって返されたプロセス構造体の p_comm フィールドに、 変更されていない状態で見つけることができます。

nchr 引数はヌルバイトを含めた最大の文字数を示し、 文字列の構築に使います。 もしもこの量を超えてしまえば、 オーバフローの原因となる文字列は切り捨てられ、 結果が部分的に返されます。これは ps(1) や w(1) のようなプログラムにとっては簡便な方法です。 これらのプログラムにおいては、 コマンドの 1 行要約のみを印字しますので、 無視するためのみに多量のテキストを複写すべきではありません。 nchr が 0 ならば、なんら制限は課されませんし、 すべての引数の文字列はそっくりそのまま返されます。

argv ポインタと文字列記憶域に割り当てられたメモリは、 kvm ライブラリによって所有されます。引き続く kvm_getprocs() と kvm_close(3) 呼び出しはこの記憶域を容赦なく使います。

kvm_getenvv() 関数は kvm_getargv() に類似していますが、環境文字列のベクタを返します。 このデータはまたプロセスにより変更可能です。

戻り値
kvm_getprocs(), kvm_getargv(), および kvm_getenvv() はすべて異常終了時に NULL を返します。

バグ
これらのルーチンは kvm インタフェースに属していません。

関連項目
kvm(3), kvm_close(3), kvm_geterr(3), kvm_nlist(3), kvm_open(3), kvm_openfiles(3), kvm_read(3), kvm_write(3)