KVM_OPEN(3)

名称
kvm_open, kvm_openfiles, kvm_close - カーネル仮想メモリ・アクセスの初期化

書式
#include <fcntl.h> #include <kvm.h>
kvm_t * kvm_open(const char *execfile, const char *corefile, const char *swapfile, int flags, const char *errstr) kvm_t * kvm_openfiles(const char *execfile, const char *corefile, const char *swapfile, int flags, char *errbuf) int kvm_close(kvm_t *kd)

解説
kvm_open() と kvm_openfiles() の各関数は kvm(3) ライブラリルーチンを介しカーネル仮想メモリに アクセスするのに使われる記述子を返します。 アクティブカーネルとクラッシュダンプは 双方ともこのインタフェース経由でアクセス可能です。

execfile は、検証されるカーネルの実行可能イメージです。 このファイルにはシンボルテーブルが含まれる必要があります。 この引数が ヌル のとき、現在実行中のシステムと仮定して getbootfile(3) から決定されます。

corefile はカーネル・メモリ・デバイスファイルで、/dev/mem にも savecore(8) が生成するクラッシュダンプコアにもなります。 corefile が ヌル のとき、<paths.h> が指示するデフォルト値 _PATH_MEM が使われます。

swapfile はスワップ・デバイスを指示します。 ヌル のとき、<paths.h> の _PATH_DRUM が使われます。

flags 引数は、 open(2) 同様に読取り / 書込みアクセスフラグを示し、 コアファイルに限定して適用します。 O_RDONLY, O_WRONLY と O_RDWR だけが許可されます。

オープン・ルーチンは 2 個あり、 その違いはエラー機構だけです。 一方は SunOS kvm ライブラリと後方互換性があり、 他方は改善されたエラー報告フレームワークを提供します。

kvm_open() 関数は Sun kvm と互換のオープン呼び出しです。 ここでは、 errstr 引数はエラーの処理方法を示します。 結果が ヌル のとき、エラーは報告されず、 アプリケーション・プログラムは kvm 呼び出しが失敗した原因は知らされません。 結果が ヌル でなければ、 perror(3) 同様にメッセージに errstr が事前に付加されて stderr に印字されます。 通常、プログラム名が使われます。ストリングは該当の kvm_close() 呼び出しまでは最低保持すると想定されます。

kvm_openfiles() 関数は BSD 様式のエラー報告を行います。 ここでは、エラー・メッセージはライブラリにより印字されません。 代わりに、アプリケーションは kvm_geterr() (kvm_geterr(3) 参照) を使用して、 一番最後の kvm library 呼び出しに該当するエラーメッセージを獲得します。 最後の kvm 呼び出しが正常であれば、結果は未定義となります。 kvm_geterr() は kvm 記述子を要求しますが、 オープンルーチンはオープン失敗のときには ヌル を戻し、オープンに失敗したときには、 kvm_geterr() を使ってエラー・メッセージを獲得できません。 したがって、 kvm_openfiles() は任意のエラー・メッセージを errbuf 引数中に置きます。 このバッファの大きさは _POSIX2_LINE_MAX キャラクタ分必要です (<limits.h>より)。

戻り値
kvm_open() と kvm_openfiles() 関数は、その後のすべての kvm ライブラリ呼び出しで 使用するための記述子を返します。 ライブラリは完全に再入可能です。 異常終了時には ヌル が返されますが、この場合、 kvm_openfiles() はエラー・メッセージを errbuf に書き込みます。

kvm_close() 関数は正常終了時に 0 を返し、 異常終了時には -1 を返します。

バグ
オープン呼び出しは 2 個持てません。 Sun ライブラリの誤定義エラーセマンティクスと BSD について後方互換ライブラリを持つ要望は 任意選択の余地がありません。

関連項目
open(2), kvm(3), kvm_getargv(3), kvm_getenvv(3), kvm_geterr(3), kvm_getprocs(3), kvm_nlist(3), kvm_read(3), kvm_write(3)