PRCTL(2)

名前
prctl - プロセスの操作を行なう

書式
#include <sys/prctl.h>

int prctl(int option, unsigned long arg2, unsigned long arg3,
          unsigned long arg4, unsigned long arg5);

説明
prctl() の動作は最初の引き数によって決定される (この値は <linux/prctl.h> に定義されている)。 残りの引き数は最初の引き数によって変化する。 一番目の引き数として以下のものを指定できる:

PR_CAPBSET_READ (Linux 2.6.25 以降)
    で指定されたケーパビリティが呼び出したスレッドのケーパビリティ バインディングセット (capability bounding set) に含まれている場合、 (関数の結果として) 1 を返し、そうでない場合 0 を返す (ケーパビリティ定数は <linux/capability.h> で定義されている)。 ケーパビリティバウンディングセットは、 execve(2) を呼び出した際に、ファイルの許可 (permitted) ケーパビリティの中で そのプロセスが獲得できるケーパビリティを指示するものである。

    arg2 に指定されたケーパビリティが有効でない場合、 呼び出しはエラー EINVAL で失敗する。

PR_CAPBSET_DROP (Linux 2.6.25 以降)
    呼び出したスレッドがケーパビリティ CAP_SETPCAP を持っている場合、 呼び出したスレッドのケーパビリティバウンディングセットから arg2 で指定されたケーパビリティを外す。 呼び出したスレッドの子プロセスは変更後のバウンディングセットを 継承する。

    呼び出したスレッドが CAP_SETPCAP を持っていない場合、呼び出しはエラー EPERM で失敗する。 arg2 に指定されたケーパビリティが有効でない場合、 EINVAL で失敗する。 ファイルケーパビリティがカーネルで有効になっていない場合 (この場合にはバウンディングセットがサポートされない)、 EINVAL で失敗する。

PR_SET_CHILD_SUBREAPER (Linux 3.4 以降)
    arg2 が 0 以外の場合、 呼び出し元プロセスの "child subreaper" 属性をセットする。 arg2 が 0 の場合、 この属性をクリアする。 プロセスが child subreaper のマークが付いている場合、 このプロセスの子プロセスやその子孫にはすべて subreaper のマークが付与される。 subreaper は事実上その子孫のプロセスに対して init(1) の役割を果たす。 孤児になったプロセス (直接の親プロセスがすでに終了しているプロセス) が終了した際、 そのプロセスに subreaper のマークが付いていると、 最も近い存在する先祖の subreaper プロセスに SIGCHLD シグナルが送られ、 そのプロセスの wait を使って終了ステータスを知ることができる。

PR_GET_CHILD_SUBREAPER (Linux 3.4 以降)
    呼び出し元の "child subreaper" 設定を、 (int *) arg2 が指す場所に返す。

PR_SET_DUMPABLE (Linux 2.3.20 以降)
    (Linux 2.3.20 以降) デフォルトの振る舞いではコアダンプを引き起こすようなシグナルを受信したときに、呼び出し元のプロセスでコアダンプを生成するかどうかを決定するフラグを設定する (通常このフラグは、デフォルトではセットされているが、 set-user-ID あるいは set-group-ID プログラムが実行されたり、 さまざまなシステムコールによってプロセスの UID や GID が操作されたときに クリアされる)。 2.6.12 以前のカーネルでは、 arg2 は 0 (プロセスはダンプ不可) あるいは 1 (プロセスはダンプ可能) の どちらかでなければならない。 2.6.13 から 2.6.17 までのカーネルでは、値 2 も認められていた。 この値を指定すると、通常はダンプされないバイナリが root だけが 読み込み可能な形でダンプされた。 セキュリティ上の理由から、この機能は削除された (proc(5) の /proc/sys/fs/suid_dumpable の説明も参照)。 ダンプ不可のプロセスを ptrace(2) PTRACE_ATTACH 経由で接続することはできない。

PR_GET_DUMPABLE (Linux 2.3.20 以降)
    (Linux 2.3.20 以降) 呼び出し元プロセスにおけるダンプ可能フラグの 現在の状態を (関数の結果として) 返す。

PR_SET_ENDIAN (Linux 2.6.18 以降、PowerPC のみ)
    呼び出し元プロセスのエンディアン設定 (endian-ness) を arg2 で指定された値に設定する。 指定できる値は PR_ENDIAN_BIG, PR_ENDIAN_LITTLE, PR_ENDIAN_PPC_LITTLE (PowerPC 擬似リトルエンディアン) のいずれか一つである。

PR_GET_ENDIAN (Linux 2.6.18 以降、PowerPC のみ)
    呼び出し元プロセスのエンディアン設定 (endian-ness) を (int *) arg2 が指す場所に格納して返す。

PR_SET_FPEMU (Linux 2.4.18 以降, 2.5.9, ia64 のみ)
    浮動小数点エミュレーション (floating-point emulation) 制御ビットを arg2 で指定された値に設定する。 指定できる値は PR_FPEMU_NOPRINT (浮動小数点命令アクセスを黙って エミュレートする) か PR_FPEMU_SIGFPE (浮動小数点命令をエミュレートせず、 代わりに SIGFPE を送る) である。

PR_GET_FPEMU (Linux 2.4.18 以降, 2.5.9, ia64 のみ)
    浮動小数点エミュレーション制御ビットの値を (int *) arg2 が指す場所に格納して返す。

PR_SET_FPEXC (Linux 2.4.21 および 2.5.32 以降、PowerPC のみ)
    浮動小数点例外モード (floating-point exception mode) を arg2 で指定された値に設定する。 指定できるのは以下の値である: PR_FP_EXC_SW_ENABLE (FPEXC で浮動小数点例外を有効にする)、 PR_FP_EXC_DIV (0 除算)、 PR_FP_EXC_OVF (オーバーフロー)、 PR_FP_EXC_UND (アンダーフロー)、 PR_FP_EXC_RES (不正確な結果 (inexact result))、 PR_FP_EXC_INV (不正な命令 (invalid operation))、 PR_FP_EXC_DISABLED (浮動小数点例外を無効にする)、 PR_FP_EXC_NONRECOV (async nonrecoverable exception mode)、 PR_FP_EXC_ASYNC (async recoverable exception mode)、 PR_FP_EXC_PRECISE (precise exception mode)。

PR_GET_FPEXC(Linux 2.4.21 および 2.5.32 以降、PowerPC のみ)
    浮動小数点例外モードの値を (int *) arg2 が指す場所に格納して返す。

PR_SET_KEEPCAPS (Linux 2.2.18 以降)
    スレッドの「ケーパビリティ保持」フラグを設定する。 このフラグは、スレッドの実 UID、実効 UID、保存 set-user-ID のうち少なくとも一つが 0 であった状態から、これら全てが 0 以外に変更されたとき、 スレッドの許可ケーパビリティ集合がクリアされるかどうかを決定する。 デフォルトでは、このような変更が行われた場合、許可ケーパビリティセットはクリアされる。「ケーパビリティ保持」フラグを設定すると、許可ケーパビリティセットはクリアされなくなる。 arg2 は 0 (許可ケーパビリティをクリアする) か 1 (許可ケーパビリティを保持する) の どちらかでなければならない。 (このような ID の変更が行われた場合、「ケーパビリティ保持」フラグの設定に関わらず、スレッドの実効ケーパビリティセットは常にクリアされる。) execve(2) が呼び出されると、「ケーパビリティ保持」フラグは 0 にリセットされる。

PR_GET_KEEPCAPS (Linux 2.2.18 以降)
    呼び出し元スレッドにおける「ケーパビリティ保持」フラグの 現在の状態を (関数の結果として) 返す。

PR_SET_NAME (Linux 2.6.9 以降)
    呼び出し元スレッドのプロセス名を (char *) arg2 が指す場所に格納された値を使って設定する。 名前は終端の NULL バイトを含めて最大で 16 バイトである (終端の NULL バイトを含めた文字列の長さが 16 バイトを超える場合、 文字列は黙って切り詰められる)。 これは、 pthread_setname_np(3) で設定でき、 pthread_getname_np(3) で取得できるのと同じ属性である。 同様に、 tid が呼び出し元スレッドの ID の場合、 この属性は /proc/self/task/[tid]/comm 経由でもアクセス可能である。

PR_GET_NAME (Linux 2.6.11 以降)
    呼び出し元スレッドの名前を (char *) arg2 が指す場所に格納して返す。 バッファーは最大で 16 バイトを格納できるようにすべきである。 返される文字列はヌル終端される。

PR_SET_NO_NEW_PRIVS (Linux 3.5 以降)
    呼び出し元プロセスの no_new_privs ビットを arg2 の値に設定する。 no_new_privs が 1 に設定されると、 execve(2) は、 execve(2) の呼び出しなしでは実行できなかったことに対する特権を許可しなくなる (例えば、 set-user-ID/set-group-ID 許可ビットやファイルケーパビリティが動作しなくなる)。 一度設定される、 このビットは解除することができない。 このビットの設定は fork(2) や clone(2) で作成された子プロセスに継承され、 execve(2) の前後で保持される。

    詳しい情報は、カーネルソースファイル Documentation/prctl/no_new_privs.txt を参照。

PR_GET_NO_NEW_PRIVS (Linux 3.5 以降)
    現在のプロセスの no_new_privs ビットの値を (関数の結果として) 返す。 値 0 は通常の execve(2) の動作を意味する。 値 1 は execve(2) が上記で述べた特権を制限する動作をすることを示す。

PR_SET_PDEATHSIG (Linux 2.1.57 以降)
    親プロセス死亡シグナル (parent process death signal) を arg2 に設定する (設定できるシグナル値の範囲は 1..maxsig であり、0 は通知の解除である)。 呼び出し元プロセスの親プロセスが死んだ際に、ここで設定した値が シグナルとして通知される。この値は fork(2) の子プロセスでは解除される。 (Linux 2.4.36 以降および 2.6.23 以降では) set-user-ID もしくは set-group-ID されたバイナリを実行した場合にも、このフラグは解除される。この値は execve(2) の前後で保持される。

PR_GET_PDEATHSIG (Linux 2.3.15 以降)
    親プロセス死亡シグナルの現在の値を (int *) arg2 が指す場所に格納して返す。

PR_SET_PTRACER (Linux 3.4 以降)
    この設定は Yama LSM が有効になっていてモード 1 ("restricted ptrace") の場合のみに意味を持つ (モードは /proc/sys/kernel/yama/ptrace_scope で参照可能)。 "ptrace プロセス ID" が arg2 で渡された場合、 呼び出し元は ptracer プロセスがそのプロセスが直接のプロセスの先祖であるかのよう呼び出したプロセスを ptrace できる、 と宣言しているということだ。 PR_SET_PTRACER 操作を行う毎に、 直前の "ptracer プロセス ID" は置きかえられる。 arg2 で PR_SET_PTRACER を 0 に設定すると、 呼び出し元の "ptracer プロセス ID" がクリアされる。 arg2 が PR_SET_PTRACER の場合、 Yama が導入した ptrace の制限は呼び出し元プロセスに対しては無効になる。

    詳しい情報は、カーネルソースファイル Documentation/security/Yama.txt を参照。

PR_SET_SECCOMP (Linux 2.6.23 以降)
    呼び出したスレッドのセキュアコンピューティング (seccomp) モードを設定する。 最近の seccomp(2) システムコールは PR_SET_SECCOMP の上位互換の機能を提供する。

    seccomp モードは arg2 で指定できる (seccomp 定数は <linux/seccomp.h> で定義されている)。

    arg2 を SECCOMP_MODE_STRICT に設定すると、 そのスレッドが呼び出しを許可されるシステムコールは read(2), write(2), _exit(2), sigreturn(2) だけになる。 それ以外のシステムコールを呼び出すと、シグナル SIGKILL が配送される。 パイプやソケットから読み込んだ、 信頼できないバイトコードを実行する必要がある大量の演算を行うアプリケーションにおいて、 strict secure computing モードは役立つ。 この操作は利用できるのは、 カーネルが CONFIG_SECCOMP を有効にして作成されている場合だけである。

    arg2 を SECCOMP_MODE_FILTER (Linux 3.5 以降) に設定すると、 許可されるシステムコールは arg3 で渡された Berkeley Packet Filter へのポインターで定義される。 この引き数は struct sock_fprog へのポインターである。 これは任意のシステムコールやシステムコール引き数をフィルタリングするために設計された。 このモードはカーネルで CONFIG_SECCOMP_FILTER が有効になっている場合にのみ利用可能である。

    SECCOMP_MODE_FILTER フィルターで fork(2) が許可されている場合、 seccomp モードは fork(2) で作成された子プロセスに継承される。 execve(2) が許可されている場合、 seccomp モードは execve(2) の前後で維持される。 フィルターで prctl() コールが許可されている場合、 追加でフィルターが定義され、 これらのフィルターは許可されないものが見つかるまで指定された順序で実行される。

    詳しい情報は、カーネルソースファイル Documentation/prctl/seccomp_filter.txt を参照。

PR_GET_SECCOMP (Linux 2.6.23 以降)
    呼び出したスレッドの secure computing モードを (関数の結果として) 返す。 呼び出したスレッドが secure computing モードでなかった場合、 この操作は 0 を返し、 呼び出したスレッドが strict secure computing モードの場合、 prctl() を呼び出すとシグナル SIGKILL がそのプロセスに送信される。 呼び出したスレッドがフィルタモードで、 このシステムコールが seccomp フィルタにより許可されている場合、 2 を返し、 そうでない場合プロセスは SIGKILL シグナルで kill されづ。 この操作が利用できるのは、カーネルが CONFIG_SECCOMP を有効にして作成されている場合だけである。

    Linux 3.8 以降では、 /proc/[pid]/status の seccomp フィールドからも同じ情報を取得できる。 この方法の場合はプロセスが kill される危険はない。 proc(5) を参照。

PR_SET_SECUREBITS (Linux 2.6.26 以降)
    呼び出したスレッドの "securebits" フラグを arg2 で渡された値に設定する。 capabilities(7) 参照。

PR_GET_SECUREBITS (Linux 2.6.26 以降)
    呼び出したスレッドの "securebits" フラグを (関数の結果として) 返す。 capabilities(7) 参照。

PR_SET_THP_DISABLE (Linux 3.15 以降)
    呼び出したスレッドの "THP disable" (THP 無効) フラグの状態を設定する。 arg2 が 0 以外の場合、フラグは有効になり、そうでない場合はクリーンされる。 このフラグを設定する方法により、 コードを変更できなかったり madvise(2) の malloc hook をが有効ではないジョブ (この方法は静的に割り当てられたデータには有効ではない)に対して、 transparent huge pages を無効にする手段が提供される。 "THP disable" フラグの設定は fork(2) で作成された子プロセスに継承され、 execve の前後で維持される。

PR_GET_THP_DISABLE (Linux 3.15 以降)
    呼び出し元スレッドの "THP disable" フラグの現在の設定を (関数の結果として) 返す。フラグがセットされている場合は 1 が、セットされていない場合は 0 が返る。

PR_GET_TID_ADDRESS (Linux 3.5 以降)
    set_tid_address(2) や clone(2) CLONE_CHILD_CLEARTID フラグで設定された clear_child_tid を取得し、 (int **) arg2 が指す場所に格納して返す。 この機能はカーネルが CONFIG_CHECKPOINT_RESTORE オプションを有効にして作成されている場合にのみ利用できる。

PR_SET_TIMERSLACK (Linux 2.6.28 以降)
    呼び出し元スレッドの現在の timer slack を arg2 で指定されたナノ秒に設定する。 arg2 が 0 以下の場合、 現在の timer slack をそのスレッドのデフォルトの timer slack 値にリセットする。 カーネルは timer slack を使って、 呼び出し元スレッドのタイマー満了のうち、どのくらい近いものグルーピングする (一纏めにする) かを決める。 その結果、 そのスレッドのタイマーの満了は最大で指定されたナノ秒分だけ遅れる場合がある。 タイマー満了をグルーピングすることで、 CPU を起こす回数が最小化されシステムの消費電力を減らすことができる。

    timer slack の影響を受けるのは、 システムコール select(2), pselect(2), poll(2), ppoll(2), epoll_wait(2), epoll_pwait(2), clock_nanosleep(2), nanosleep(2), futex(2) により設定されたタイマー満了である (また、 futex を使って実装されているライブラリ関数 pthread_cond_timedwait(3), pthread_mutex_timedlock(3), pthread_rwlock_timedrdlock(3), pthread_rwlock_timedwrlock(3), sem_timedwait(3) も影響を受ける)。

    timer slack はリアルタイムスケジューリングポリシーでスケジューリングされるスレッドには提供されない (sched_setscheduler(2) 参照)。

    各スレッドには timer slack に関連する値が 2 つある。 「デフォルト値」と「現在値」である。 現在値はタイマー満了のグルーピングを制御する。 新しいスレッドが作成される際、 2 つの timer slack 値はそのスレッドを作成したスレッドの現在値と同じに設定される。 その後、 スレッドは PR_SET_TIMERSLACK で現在の timer slack 値を調整できる (デフォルト値は変更できない)。 すべてのプロセスの先祖となる init (PID 1) の timer slack 値は 50,000 ナノ秒 (50 ミリ秒) である。 timer slack 値は execve(2) の前後で保持される。

PR_GET_TIMERSLACK (Linux 2.6.28 以降)
    呼び出し元スレッドの現在のタイマーのスラック値を (関数の結果として) 返す。

PR_SET_TIMING (Linux 2.6.0-test4 以降)
    (通常の、伝統的に使われてきた) 統計的なプロセスタイミングを使用するか、 正確なタイムスタンプに基づくプロセスタイミングを使用するかを設定する。 arg2 に指定できる値は PR_TIMING_STATISTICAL か PR_TIMING_TIMESTAMP である。 PR_TIMING_TIMESTAMP は現在のところ実装されていない (このモードに設定しようとするとエラー EINVAL が起こることだろう)。

PR_GET_TIMING (Linux 2.6.0-test4 以降)
    現在使用中のプロセスタイミングを決める方法を (関数の結果として) 返す。

PR_TASK_PERF_EVENTS_DISABLE (Linux 2.6.31 以降)
    呼び出したプロセスに接続されたすべての性能カウンターを無効にする。 カウンターがこのプロセスにより作成されたか他のプロセスにより作成されたかは関係ない。 呼び出したプロセスが他のプロセス用に作成した性能カウンターは影響を受けない。 性能カウンターの詳細については Linux カーネルソースの tools/perf/design.txt を参照。

    以前は PR_TASK_PERF_COUNTERS_DISABLE と呼ばれていた。 Linux 2.6.32 で名前が変更された (数値は同じままである)。

PR_TASK_PERF_EVENTS_ENABLE (Linux 2.6.31 以降)
    PR_TASK_PERF_EVENTS_DISABLE の逆。 呼び出したプロセスに接続された性能カウンターを有効にする。

    以前は PR_TASK_PERF_COUNTERS_ENABLE と呼ばれていた。 Linux 2.6.32 で名前が変更された。

PR_SET_TSC (Linux 2.6.26 以降, x86 のみ)
    そのプロセスがタイムスタンプカウンターを読み出せるかを決定する フラグの状態を設定する。 読み出しを許可する場合は arg2 に PR_TSC_ENABLE を、そのプロセスがタイムスタンプカウンターを読み出そうとした際に SIGSEGV を発生させる場合には PR_TSC_SIGSEGV を渡す。

PR_GET_TSC (Linux 2.6.26 以降, x86 のみ)
    そのプロセスがタイムスタンプカウンターを読み出せるかを決定する フラグの状態を (int *) arg2 が指す場所に格納して返す。

PR_SET_UNALIGN
    (ia64 では Linux 2.3.48 以降; parisc では Linux 2.6.15 以降; PowerPC では Linux 2.6.18 以降; Alpha では　Linux 2.6.22 以降; これらのアーキテクチャーのみ) unaligned アクセス制御ビットを arg2 で指定された値に設定する。 指定できる値は PR_UNALIGN_NOPRINT (unaligned なユーザーアクセスを黙って 修正する) か PR_UNALIGN_SIGBUS (unaligned なユーザーアクセスがあった場合 SIGBUS を生成する) である。

PR_GET_UNALIGN
    (バージョンとアーキテクチャーの情報は PR_SET_UNALIGN 参照) unaligned アクセス制御ビットの値を (int *) arg2 が指す場所に格納して返す。

PR_MCE_KILL (Linux 2.6.32 以降)
    現在のスレッドの machine check memory corruption kill ポリシーを設定する。 arg2 が PR_MCE_KILL_CLEAR の場合、 このスレッドの memory corruption kill ポリシーをクリアし、 システム全体のデフォルト値を使用する (システム全体のデフォルトは /proc/sys/vm/memory_failure_early_kill で定義される。 proc(5) 参照)。 arg2 が PR_MCE_KILL_SET の場合、 スレッド固有の memory corruption kill ポリシーを使用する。 この場合、 arg3 によりこのポリシーが early kill (PR_MCE_KILL_EARLY か、 late kill (PR_MCE_KILL_LATE) か、 システム全体のデフォルト値 (PR_MCE_KILL_DEFAULT) が指定される。 early kill は、 ハードウェアメモリー破壊 (corruption) がスレッドのアドレス空間内で検出されるとすぐに、 そのスレッドが SIGBUS シグナルを受信することを意味する。 late kill モードでは、 メモリー破壊が起こったページにアクセスした場合にのみ、 そのプロセスが kill される。 SIGBUS シグナルの詳細は sigaction(2) を参照。 このポリシーは子プロセスに継承される。 未使用の残りの prctl() の引き数は将来の互換性のため 0 にしなければならない。

PR_MCE_KILL_GET (Linux 2.6.32 以降)
    現在のプロセス単位の machine check kill ポリシーを返す。 未使用の prctl() の引き数はすべて 0 にしなければならない。

PR_SET_MM (Linux 3.3 以降)
    呼び出したプロセスのカーネルメモリーマップディスクリプターのフィールドを変更する。 これらのフィールドは通常カーネルと動的リンカーにより設定される (詳しい情報は ld.so を参照)。 通常のアプリケーションはこの機能を利用すべきではない。 しかしながら、自分を書き換えるプログラムなど、 プログラムが自分自身のメモリーマップを変更するのが有用な場面もある。 この機能はカーネルが CONFIG_CHECKPOINT_RESTORE オプションを有効にして作成されている場合にのみ利用できる。 呼び出したプロセスは CAP_SYS_RESOURCE ケーパビリティを持っていなければならない。 arg2 の値には以下のいずれかを指定し、 arg3 でそのオプションの新しい値を指定する。

    PR_SET_MM_START_CODE
        プログラムテキストを実行できるアドレスの上限を設定する。 対応するメモリー領域は読み出し可能で実行可能でなければならないが、 書き込み可能だったり共有可能だったりしてはならない (詳しい情報は mprotect(2) と mmap(2) 参照)。

    PR_SET_MM_END_CODE
        プログラムテキストを実行できるアドレスの下限を設定する。 対応するメモリー領域は読み出し可能で実行可能でなければならないが、 書き込み可能だったり共有可能だったりしてはならない。

    PR_SET_MM_START_DATA
        初期化済データや未初期化 (bss) データを配置する領域のアドレス上限を指定する。 対応するメモリー領域は読み書き可能でなければならないが、 実行可能だったり共有可能だったりしてはならない。

    PR_SET_MM_END_DATA
        初期化済データや未初期化 (bss) データを配置する領域のアドレス下限を指定する。 対応するメモリー領域は読み書き可能でなければならないが、 実行可能だったり共有可能だったりしてはならない。

    PR_SET_MM_START_STACK
        スタックの開始アドレスを設定する。 対応するメモリー領域は読み書き可能でなければならない。

    PR_SET_MM_START_BRK
        brk(2) コールで拡張できるプログラムのヒープ領域のアドレス上限を設定する。 このアドレスは、プログラムの現在のデータセグメントの最終アドレスより大きくなければならない。 また、 変更後のヒープとデータセグメントのサイズを合わせたサイズが RLIMIT_DATA リソースリミットを超えることはできない (setrlimit(2) 参照)。

    PR_SET_MM_BRK
        現在の brk(2) 値を設定する。 このアドレスの要件は PR_SET_MM_START_BRK オプションと同じである。

    以下のオプションは Linux 3.5 以降で利用できる。

    PR_SET_MM_ARG_START
        プログラムのコマンドラインを配置するアドレスの上限を設定する。

    PR_SET_MM_ARG_END
        プログラムのコマンドラインを配置するアドレスの下限を設定する。

    PR_SET_MM_ENV_START
        プログラムの環境情報 (environment) を配置するアドレスの上限を設定する。

    PR_SET_MM_ENV_END
        プログラムの環境情報 (environment) を配置するアドレスの下限を設定する。

        PR_SET_MM_ARG_START, PR_SET_MM_ARG_END, PR_SET_MM_ENV_START, PR_SET_MM_ENV_END で指定されるアドレスはプロセスのスタック領域に属している必要がある。 したがって、これらのメモリー領域は読み書き可能でなければならない。 また、 (カーネル設定によっては) MAP_GROWSDOWN 属性がセットされていなければならない (mmap(2) 参照)。

    PR_SET_MM_AUXV
        新しい補助ベクトル (auxiliary vector) を設定する。 arg3 引き数はベクトルのアドレスを指定し、 arg4 はベクトルのサイズを指定する。

    PR_SET_MM_EXE_FILE
        /proc/pid/exe シンボリックリンクを arg3 引き数で渡された新しい実行可能なファイルディスクリプターを指すシンボリックリンクで置き換える。 ファイルディスクリプターは通常の open(2) コールで取得すべきである。

        シンボリックリンクを変更するには、 既存の実行可能なメモリー領域のすべてをアンマップする必要がある。これにはカーネル自身が作成した領域も含まれる (例えば、カーネルは通常 ELF .text セクションに少なくとも一つの実行可能なメモリー領域を作成する)。

        二つ目の制限は、このような変更はプロセスの生存期間で一度だけ行うことができるという点である。 一度変更を行った後で変更を行おうとすると拒否される。 この動作は、 システム管理者が、 システムで動作するすべてのプロセスが行う、 普通でないシンボリックリンクの変更を監視するのを楽にする。

PR_MPX_ENABLE_MANAGEMENT, PR_MPX_DISABLE_MANAGEMENT (Linux 3.19 以降)
    Memory Protection eXtensions (MPX) の境界テーブル (bounds table) のカーネル管理の有効化/無効化を行う。 引き数 arg2, arg3, arg4, arg5 は 0 でなければならない。

    MPX は、 ポインターの境界チェックを行うハードウェア支援機構である。 この機能は、 境界情報を格納するレジスター群と、 境界チェックをどの命令に課すかを CPU に教えるための特別な命令プレフィックスの集合で構成される。 これらのレジスター数は限られており、 レジスター数よりも多くのポインターがある場合には、 その内容をテーブル群に退避する (spilled) 必要がある。 これらのテーブル群は「境界テーブル (bounds tables)」と呼ばれ、 MPX prctl 命令はカーネルがこれらの割り当てと解放を行うかどうかを制御する。

    管理が有効になっている場合、 カーネルが境界テーブルの割り当てと解放を担当する。 最初に存在しない境界テーブルを使おうとした際に上がる #BR 例外を捕捉し、 ユーザー空間に例外を配送せずに、 テーブルの割り当てを行い、 新しいテーブルに境界情報 (bounds directory) を書き込む。 解放に関しては、 カーネルが割り当てられていないメモリーに対応する境界テーブルが存在するかを確認し、 そうであれば解放を行う。

    PR_MPX_ENABLE_MANAGEMENT を使って MPX 管理を有効にする前に、 アプリケーションはまず境界情報管理用のユーザー空間バッファーを割り当て、 その管理情報の場所を bndcfgu レジスターに設定しなければならない。

    CPU やカーネルが MPX をサポートしていない場合、 これらの呼び出しは失敗する。 カーネルによる MPX のサポートは CONFIG_X86_INTEL_MPX 設定オプションで有効にできる。 CPU が MPX をサポートしているかを確認するには、 以下のように 'mpx' CPUID ビットを見ればよい。

      cat /proc/cpuinfo | grep ' mpx '

    MPX が有効になっている間は、 スレッドはロング (64 ビット) モードのオン/オフの切り替えはできない。

    プロセス内のすべてのスレッドがこれらの呼び出しの影響を受ける。

    fork(2) で作成された子プロセスは MPX 管理の状態を継承する。 execve(2) の中で、 MPX 管理は PR_MPX_DISABLE_MANAGEMENT が呼ばれた場合と同じ状態がリセットされる。

    Intel MPX についての詳しい情報は、カーネルソースファイル Documentation/x86/intel_mpx.txt を参照。

返り値
成功すると、 PR_GET_DUMPABLE, PR_GET_KEEPCAPS, PR_GET_NO_NEW_PRIVS, PR_GET_THP_DISABLE, PR_CAPBSET_READ, PR_GET_TIMING, PR_GET_TIMERSLACK, PR_GET_SECUREBITS, PR_MCE_KILL_GET, PR_GET_SECCOMP は上述の負でない値を返す (なお、PR_GET_SECCOMP は返らない場合もある)。 option が他の値の場合は成功時に 0 を返す。 エラーの場合、-1 を返し、 errno に適切な値を設定する。

エラー

EFAULT
    arg2 が不正なアドレスである。

EFAULT
    option が PR_SET_SECCOMP で、 arg2 が SECCOMP_MODE_FILTER で、 カーネルが CONFIG_SECCOMP_FILTER を有効にして作成されており、 arg3 が無効なアドレスである。

EINVAL
    option の値が理解できない。

EINVAL
    option が PR_MCE_KILL, PR_MCE_KILL_GET, PR_SET_MM のいずれかで、かつ未使用の prctl() 引き数に 0 が指定されていなかった。

EINVAL
    arg2 が指定された option で有効な値ではない。

EINVAL
    option が PR_SET_SECCOMP か PR_GET_SECCOMP だが、カーネルが CONFIG_SECCOMP を有効にして作成されていなかった。

EINVAL
    option が PR_SET_SECCOMP で、 arg2 が SECCOMP_MODE_FILTER で、 カーネルが CONFIG_SECCOMP を有効にして作成されていなかった。

EINVAL
    option が PR_SET_MM で、以下のいずれかが真である。

    *   arg4 が arg5 で 0 以外である。

    *   arg3 が TASK_SIZE よりも大きい (TASK_SIZE はこのアーキテクチャーでユーザー空間アドレススペースの最大サイズである)。

    *   arg2 が PR_SET_MM_START_CODE, PR_SET_MM_END_CODE, PR_SET_MM_START_DATA, PR_SET_MM_END_DATA, PR_SET_MM_START_STACK のどれかで、対応するメモリー領域のアクセス許可が要件を満たしていない。

    *   arg2 が PR_SET_MM_START_BRK か PR_SET_MM_BRK で、 arg3 データセグメントの末尾と同じかそれより前か、 arg3 に RLIMIT_DATA リソースリミットを超えてしまうような値が指定されている。

EINVAL
    option が PR_SET_PTRACER で arg2 が 0, PR_SET_PTRACER_ANY, 既存プロセスの PID のいずれでもない。

EINVAL
    option が PR_SET_PDEATHSIG で、 arg2 で指定された値は無効なシグナル番号である。

EINVAL
    option が PR_SET_DUMPABLE で、 arg2 が SUID_DUMP_DISABLE でも SUID_DUMP_USER でもない。

EINVAL
    option が PR_SET_TIMING で、 arg2 が PR_TIMING_STATISTICAL ではない。

EINVAL
    option が PR_SET_NO_NEW_PRIVS で、 arg2 が 1 以外か、 arg3, arg4, arg5 のどれかが 0 ではない。

EINVAL
    option が PR_GET_NO_NEW_PRIVS で、 arg2, arg3, arg4, arg5 のどれかが 0 ではない。

EINVAL
    option が PR_SET_THP_DISABLE で arg3, arg4, arg5 のどれかが 0 ではない。

EINVAL
    option が PR_GET_THP_DISABLE で arg2, arg3, arg4, arg5 のいずれが 0 ではない。

EPERM
    option が PR_SET_SECUREBITS で、呼び出し元がケーパビリティ CAP_SETPCAP を持っていない。 または、"locked" フラグを解除しようとした。 または、locked フラグがセットされているフラグをセットしようとした (capabilities(7) 参照)。

EPERM
    option が PR_SET_KEEPCAPS で、呼び出し元のフラグ SECURE_KEEP_CAPS_LOCKED がセットされている (capabilities(7) 参照)。

EPERM
    option が PR_CAPBSET_DROP で、呼び出し元がケーパビリティ CAP_SETPCAP を持っていない。

EPERM
    option が PR_SET_MM で、呼び出し元がケーパビリティ CAP_SYS_RESOURCE を持っていない。

EACCES
    option が PR_SET_MM、かつ arg3 が PR_SET_MM_EXE_FILE で、ファイルが実行可能ではない。

EBUSY
    option が PR_SET_MM で、 arg3 が PR_SET_MM_EXE_FILE で、 /proc/pid/exe シンボリックリンクを変更しようとしたが、 禁止されている。

EBADF
    option が PR_SET_MM で、 arg3 が PR_SET_MM_EXE_FILE で、 arg4 で渡されたファイルディスクリプターが有効ではない。

ENXIO
    option が PR_MPX_ENABLE_MANAGEMENT か PR_MPX_DISABLE_MANAGEMENT で、 カーネルか CPU が MPX の管理をサポートしていない。 カーネルとプロセスが MPX をサポートしているか確認すること。

バージョン
prctl() システムコールは Linux 2.1.57 で導入された。

準拠
このコールは Linux 特有である。 IRIX には prctl() システムコールがあるが (MIPS アーキテクチャーにおいて irix_prctl として Linux 2.1.44 で同様に導入された)、 そのプロトタイプは

ptrdiff_t prctl(int option, int arg2, int arg3);

である。ユーザー当りのプロセス最大数を取得するオプション、 プロセスの使用できる最大プロッサー数を取得するオプション、 現在特定のプロセスが停止(block)させられているかどうか調べるオプション、 スタックサイズの最大値の取得や設定を行なうオプションなどがある。

関連項目
signal(2), core(5)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部である。 プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。