unshare

Autres langues

Langue: ja

Version: 2005-03-10 (mandriva - 01/05/08)

Autres sections - même nom

Section: 2 (Appels système)

名前

unshare - プロセス実行コンテキストの一部を分離する

書式

 #include <sched.h>
 
 int unshare(int flags);
 

説明

unshare() を使うと、プロセスは他のプロセスと現在共有している 実行コンテキストの一部を分離することができる。 実行コンテキストの一部、たとえば名前空間などは、 新しいプロセスを fork(2) または vfork(2) を使って生成したときに、暗黙のうちに共有される。 一方、仮想メモリなどは、 clone(2) を使ってプロセスを生成するときに、明示的に共有することを要求できる。

unshare() の主な利用法は、プロセスが新しいプロセスを生成することなく、 共有実行コンテキストを制御することである。

flags 引き数はビットマスクであり、 実行コンテキストのどの部分の共有を解除するかを表す。 この引き数は、以下の定数の 0 個以上の OR で指定する:

CLONE_FILES
clone(2) CLONE_FILES フラグの効果を取り消す。 ファイルディスクリプタテーブルを共有させず、 呼び出し元プロセスは他のプロセスとファイルディスクリプタを共有しなくなる。
CLONE_FS
clone(2) CLONE_FS フラグの効果を取り消す。 ファイルシステム属性を共有させず、 呼び出し元プロセスは他のプロセスとルートディレクトリ・ カレントディレクトリ・umask 属性を共有しなくなる。 chroot(2), chdir(2), umask(2) に影響する。
CLONE_NEWNS
このフラグは clone(2) CLONE_NEWNS フラグと同じ効果を持つ。 名前空間を共有せず、呼び出し元プロセスは 他のプロセスとは共有しない固有の名前空間のコピーを持つ。 このフラグを指定すると、 CLONE_FS も暗黙のうちに指定される。

flags に 0 が指定された場合、 unshare() は何も行わないので、 呼び出し元プロセスの実行コンテキストは、何も変更されない。

返り値

成功した場合は 0 が返される。 失敗した場合は -1 が返されて、 errno にはエラーを示す値が設定される。

エラー

EPERM
flagsCLONE_NEWNS が指定されたが、呼び出し元プロセスに特権 (CAP_SYS_ADMIN ケーパビリティ) がなかった。
ENOMEM
呼び出し元のコンテキストのうち共有を解除する必要がある部分をコピーするために、 十分なメモリが確保できなかった。
EINVAL
flags に不正なビットが指定された。

バージョン

unshare() システムコールは Linux カーネル 2.6.16 で追加された。

準拠

unshare() システムコールは Linux 固有である。

注意

clone(2) で新しいプロセスを生成したときに共有される全てのプロセス属性を、 unshare() によって共有の解除ができるわけではない。 特に、カーネル 2.6.16 においては、 unshare() に CLONE_SIGHAND, CLONE_SYSVSEM, CLONE_THREAD, CLONE_VM の効果を取り消すためのフラグが実装されていない。 これらの機能は、必要であれば将来追加されるかもしれない。

関連項目

clone(2), fork(2), vfork(2), Documentation/unshare.txt