KCMP(2)

名前
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/ に書かれている。