EN JA
UNSHARE(2)
UNSHARE(2) Linux Programmer's Manual UNSHARE(2)

名前

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

書式


#include <sched.h>
 

int unshare(int flags );
 

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
 
unshare():
Since glibc 2.14:
_GNU_SOURCE
Before glibc 2.14:
_BSD_SOURCE || _SVID_SOURCE
/* _GNU_SOURCE also suffices */

説明

unshare() を使うと、プロセスは他のプロセスと現在共有している実行コンテキストの一部を分離することができる。実行コンテキストの一部、たとえばマウント名前空間 (mount namespace) などは、新しいプロセスを fork(2) または vfork(2) を使って生成したときに、暗黙のうちに共有される。一方、仮想メモリなどは、 clone(2) を使ってプロセスを生成するときに、明示的に共有することを要求できる。
 
unshare() の主な利用法は、プロセスが新しいプロセスを生成することなく、共有実行コンテキストを制御することである。
 
flags 引き数はビットマスクであり、実行コンテキストのどの部分の共有を解除するかを表す。この引き数は、以下の定数の 0 個以上の OR で指定する:
CLONE_FILES
clone(2) CLONE_FILES フラグの効果を取り消す。ファイルディスクリプタテーブルを共有させず、呼び出し元プロセスは他のプロセスとファイルディスクリプタを共有しなくなる。
CLONE_FS
clone(2) CLONE_FS フラグの効果を取り消す。ファイルシステム属性を共有させず、呼び出し元プロセスは、ルートディレクトリ ( chroot(2))、カレントディレクトリ ( chdir(2))、 umask ( umask(2)) を他のプロセスと共有しなくなる。
CLONE_NEWIPC (Linux 2.6.19 以降)
このフラグは clone(2) CLONE_NEWIPC フラグと同じ効果を持つ。 System V IPC 名前空間を共有せず、呼び出し元プロセスは他のプロセスとは共有しない固有の System V IPC 名前空間のコピーを持つ。このフラグを指定すると、 CLONE_SYSVSEM も暗黙のうちに指定される。 CLONE_NEWIPC を使用するには CAP_SYS_ADMIN ケーパビリティが必要である。
CLONE_NEWNET (Linux 2.6.24 以降)
このフラグは clone(2) CLONE_NEWNET フラグと同じ効果を持つ。ネットワーク名前空間を共有せず、呼び出し元プロセスは他のプロセスとは共有しない固有のネットワーク名前空間のコピーを持つ。 CLONE_NEWNET を使用するには CAP_SYS_ADMIN ケーパビリティが必要である。
CLONE_NEWNS
このフラグは clone(2) CLONE_NEWNS フラグと同じ効果を持つ。マウント名前空間を共有せず、呼び出し元プロセスは他のプロセスとは共有しない固有の名前空間のコピーを持つ。このフラグを指定すると、 CLONE_FS も暗黙のうちに指定される。 CLONE_NEWNS を使用するには CAP_SYS_ADMIN ケーパビリティが必要である。
CLONE_NEWUTS (Linux 2.6.19 以降)
このフラグは clone(2) CLONE_NEWUTS フラグと同じ効果を持つ。 UTS IPC 名前空間を共有せず、呼び出し元プロセスは他のプロセスとは共有しない固有の UTS IPC 名前空間のコピーを持つ。このフラグを指定すると、 CLONE_FS も暗黙のうちに指定される。 CLONE_NEWUTS を使用するには CAP_SYS_ADMIN ケーパビリティが必要である。
CLONE_SYSVSEM (Linux 2.6.26 以降)
このフラグは clone(2) CLONE_SYSVSEM フラグの効果を逆転させる。 System V セマフォのアンドゥ値を共有せず、呼び出し元プロセスは他のプロセスとは共有しない固有のコピーを持つ。 CLONE_SYSVSEM を使用するには CAP_SYS_ADMIN ケーパビリティが必要である。

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

返り値

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

エラー

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

バージョン

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

準拠

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

注意

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

関連項目

clone(2), fork(2), kcmp(2), setns(2), vfork(2)
 
Linux カーネルソース内の Documentation/unshare.txt

この文書について

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