.\" Copyright (C) 2012, Cyrill Gorcunov .\" and Copyright (C) 2012, Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of .\" this manual under the conditions for verbatim copying, provided that .\" the entire resulting derived work is distributed under the terms of .\" a permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume .\" no responsibility for errors or omissions, or for damages resulting .\" from the use of the information contained herein. The author(s) may .\" not have taken the same level of care in the production of this .\" manual, which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Kernel commit d97b46a64674a267bc41c9e16132ee2a98c3347d .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .\" .\" Japanese Version Copyright (c) 2013 Akihiro MOTOKI .\" all rights reserved. .\" Translated 2013-08-21, Akihiro MOTOKI .\" .TH KCMP 2 2013\-12\-08 Linux "Linux Programmer's Manual" .SH 名前 kcmp \- 二つのプロセスが同じカーネルリソースを共有しているかを比較する .SH 書式 .nf \fB#include \fP \fBint kcmp(pid_t \fP\fIpid1\fP\fB, pid_t \fP\fIpid2\fP\fB, int \fP\fItype\fP\fB,\fP \fB unsigned long \fP\fIidx1\fP\fB, unsigned long \fP\fIidx2\fP\fB);\fP .fi \fI注\fP: このシステムコールには glibc のラッパー関数は存在しない。「注意」の節を参照。 .SH 説明 システムコール \fBkcmp\fP() を使うと、 ID が \fIpid1\fP と \fIpid2\fP の二つのプロセスが、 仮想メモリーやファイルディスクリプターなどの、 同じカーネルリソースを共有しているかどうかを検査できる。 \fItype\fP 引き数は 2 つのプロセス間でどのリソースを比較するかを指定する。 以下のいずれかの値を指定する。 .TP \fBKCMP_FILE\fP プロセス \fIpid1\fP のファイルディスクリプター \fIidx1\fP が、 プロセス \fIpid2\fP のファイルディスクリプター \fIidx2\fP と同じオープンファイル記述 (open file description) を参照しているかを検査する。 .TP \fBKCMP_FILES\fP 二つのプロセスが同じオープンファイル記述の集合を共有しているかを検査する。 引き数 \fIidx1\fP と \fIidx2\fP は無視される。 .TP \fBKCMP_FS\fP 二つのプロセスが同じファイルシステム情報 (すなわち、ファイルのモード作成マスク、作業ディレクトリ、ファイルシステムのルート) を共有しているかを検査する。 引き数 \fIidx1\fP と \fIidx2\fP は無視される。 .TP \fBKCMP_IO\fP 二つのプロセスが I/O コンテキストを共有しているかを検査する。 引き数 \fIidx1\fP と \fIidx2\fP は無視される。 .TP \fBKCMP_SIGHAND\fP 二つのプロセスがシグナル配送 (disposition) テーブルを共有しているかを検査する。 引き数 \fIidx1\fP と \fIidx2\fP は無視される。 .TP \fBKCMP_SYSVSEM\fP 二つのプロセスが同じ System\ V セマフォ undo 操作のリストを共有しているかを検査する。 引き数 \fIidx1\fP と \fIidx2\fP は無視される。 .TP \fBKCMP_VM\fP 二つのプロセスが同じアドレス空間を共有しているかを検査する。 引き数 \fIidx1\fP と \fIidx2\fP は無視される。 .PP \fBkcmp\fP() には、タスクが実行されている場合に起こり得る誤判定 (false positive) に関する保護はない。 ということは、 意味のある結果を得るためには、 このシステムコールで検査を行う前に、 \fBSIGSTOP\fP を送信してタスクを停止すべきだということだ (\fBsignal\fP(7) 参照)。 .SH 返り値 \fBkcmp\fP() の呼び出しが成功した場合の返り値は、単にカーネルポインターを数値で比較した結果となる (カーネルはリソースを比較する際、リソースのメモリーアドレスを使用する)。 これを説明するには、例を見るのが一番簡単である。 \fIv1\fP と \fIv2\fP を適切なリソースのアドレスとすると、 返り値は以下のいずれか一つとなる。 .RS 4 .IP 0 4 \fIv1\fP は \fIv2\fP と等しい。言い換えれば、二つのプロセスはそのリソースを共有している。 .IP 1 \fIv1\fP は \fIv2\fP より小さい。 .IP 2 \fIv1\fP は \fIv2\fP より大きい。 .IP 3 \fIv1\fP は \fIv2\fP と等しくないが、順序情報がない。 .RE .PP エラーの場合は \-1 が返され、 \fIerrno\fP が適切に設定される。 \fBkcmp\fP() は、ソートに適した値を返すように設計された。 大量のファイルディスクリプターを比較する必要がある場合に、特に役に立つ。 .SH エラー .TP \fBEBADF\fP \fItype\fP が \fBKCMP_FILE\fP で、かつ \fIfd1\fP か \fIfd2\fP がオープンファイル記述でない。 .TP \fBEINVAL\fP \fItype\fP が無効である。 .TP \fBEPERM\fP プロセスのリソースを検査するのに十分な許可がない。 自分が所有していないプロセスを検査するためには \fBCAP_SYS_PTRACE\fP ケーパビリティが必要である。 .TP \fBESRCH\fP プロセス \fIpid1\fP か \fIpid2\fP が存在しない。 .SH バージョン \fBkcmp\fP() システムコールは Linux 3.5 で初めて登場した。 .SH 準拠 \fBkcmp\fP() は Linux 特有であり、 移植を考慮したプログラムでは使用すべきではない。 .SH 注意 glibc はこのシステムコールに対するラッパー関数を提供していない。 \fBsyscall\fP(2) を使って呼び出すこと。 このシステムコールが利用できるのは、 カーネルの \fBCONFIG_CHECKPOINT_RESTORE\fP オプションが有効になっている場合だけである。 このシステムコールの主な用途は、 ユーザー空間でのチェックポイント/リストア (checkpoint/restore in user space; CRIU) 機能である。 このシステムコールを使わないとすると、 \fBproc\fP(5) ファイルシステム経由で必要なプロセス情報を公開することになるが、 これはセキュリティ上の理由から不適切とみなされた。 このページで参照されている共有リソースに関する背景についての情報は \fBclone\fP(2) を参照のこと。 .SH 関連項目 \fBclone\fP(2), \fBunshare\fP(2) .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man\-pages/ に書かれている。