kcmp -
二つのプロセスが同じカーネルリソースを共有しているかを比較する
#include <linux/kcmp.h>
int kcmp(pid_t pid1, pid_t pid2, int type,
unsigned long idx1, unsigned long idx2);
注:
このシステムコールには
glibc
のラッパー関数は存在しない。「注意」の節を参照。
システムコール
kcmp()
を使うと、 ID が
pid1 と
pid2
の二つのプロセスが、
仮想メモリーやファイルディスクリプターなどの、
同じカーネルリソースを共有しているかどうかを検査できる。
type 引き数は 2
つのプロセス間でどのリソースを比較するかを指定する。
以下のいずれかの値を指定する。
- KCMP_FILE
- プロセス pid1
のファイルディスクリプター
idx1 が、 プロセス pid2
のファイルディスクリプター
idx2
と同じオープンファイル記述
(open file description)
を参照しているかを検査する。
- KCMP_FILES
- 二つのプロセスが同じオープンファイル記述の集合を共有しているかを検査する。
引き数 idx1 と idx2
は無視される。
- KCMP_FS
- 二つのプロセスが同じファイルシステム情報
(すなわち、ファイルのモード作成マスク、作業ディレクトリ、ファイルシステムのルート)
を共有しているかを検査する。
引き数 idx1 と idx2
は無視される。
- KCMP_IO
- 二つのプロセスが
I/O
コンテキストを共有しているかを検査する。
引き数 idx1 と idx2
は無視される。
- KCMP_SIGHAND
- 二つのプロセスがシグナル配送
(disposition)
テーブルを共有しているかを検査する。
引き数 idx1 と idx2
は無視される。
- KCMP_SYSVSEM
- 二つのプロセスが同じ
System V セマフォ undo
操作のリストを共有しているかを検査する。
引き数 idx1 と idx2
は無視される。
- KCMP_VM
- 二つのプロセスが同じアドレス空間を共有しているかを検査する。
引き数 idx1 と idx2
は無視される。
kcmp()
には、タスクが実行されている場合に起こり得る誤判定
(false positive)
に関する保護はない。
ということは、
意味のある結果を得るためには、
このシステムコールで検査を行う前に、
SIGSTOP
を送信してタスクを停止すべきだということだ
(
signal(7) 参照)。
kcmp()
の呼び出しが成功した場合の返り値は、単にカーネルポインターを数値で比較した結果となる
(カーネルはリソースを比較する際、リソースのメモリーアドレスを使用する)。
これを説明するには、例を見るのが一番簡単である。
v1 と
v2
を適切なリソースのアドレスとすると、
返り値は以下のいずれか一つとなる。
- 0
-
v1 は v2
と等しい。言い換えれば、二つのプロセスはそのリソースを共有している。
- 1
-
v1 は v2
より小さい。
- 2
-
v1 は v2
より大きい。
- 3
-
v1 は v2
と等しくないが、順序情報がない。
エラーの場合は -1
が返され、
errno
が適切に設定される。
kcmp()
は、ソートに適した値を返すように設計された。
大量のファイルディスクリプターを比較する必要がある場合に、特に役に立つ。
- EBADF
-
type が KCMP_FILE
で、かつ fd1 か fd2
がオープンファイル記述でない。
- EINVAL
-
type
が無効である。
- EPERM
- プロセスのリソースを検査するのに十分な許可がない。
自分が所有していないプロセスを検査するためには
CAP_SYS_PTRACE
ケーパビリティが必要である。
- ESRCH
- プロセス pid1 か
pid2 が存在しない。
kcmp() システムコールは
Linux 3.5
で初めて登場した。
kcmp() は Linux 特有であり、
移植を考慮したプログラムでは使用すべきではない。
glibc
はこのシステムコールに対するラッパー関数を提供していない。
syscall(2)
を使って呼び出すこと。
このシステムコールが利用できるのは、
カーネルの
CONFIG_CHECKPOINT_RESTORE
オプションが有効になっている場合だけである。
このシステムコールの主な用途は、
ユーザー空間でのチェックポイント/リストア
(checkpoint/restore in user space; CRIU)
機能である。
このシステムコールを使わないとすると、
proc(5)
ファイルシステム経由で必要なプロセス情報を公開することになるが、
これはセキュリティ上の理由から不適切とみなされた。
このページで参照されている共有リソースに関する背景についての情報は
clone(2) を参照のこと。
clone(2),
unshare(2)
この man ページは Linux
man-pages
プロジェクトのリリース
3.79 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。