setns -
スレッドに名前空間を関連付けしなおす
#define _GNU_SOURCE /* feature_test_macros(7) 参照 */
#include <sched.h>
int setns(int fd, int nstype);
名前空間を参照するファイルディスクリプタを指定すると、
呼び出したスレッドにその名前空間を関連付けしなおす。
fd 引き数は、
/proc/[pid]/ns/
ディレクトリ内の名前空間エントリ
のいずれかを参照するファイルディスクリプタである。
/proc/[pid]/ns/ の詳細は
proc(5)
を参照。
nstype
引き数で指定された制限の範囲内で、
呼び出したスレッドに
fd
に対応する名前空間を関連付けしなおす。
nstype
引き数は、呼び出したスレッドがどのタイプの名前空間を
関連付けしなおすことができるかを指定する。
この引き数には以下のいずれかの値を指定できる。
- 0
- どのタイプの名前空間も関連付けることができる。
- CLONE_NEWIPC
- fd は IPC
名前空間を参照していなければならない。
- CLONE_NEWNET
- fd
はネットワーク名前空間を参照していなければならない。
- CLONE_NEWUTS
- fd は UTS
名前空間を参照していなければならない。
呼び出し側が
fd
がどのタイプの名前空間を参照しているかを知っている
(もしくは気にする必要がない)
場合には、
nstype に 0
を指定すれば十分
である。呼び出し側が
fd
がどのタイプの名前空間を参照しているかを
知っておらず、かつ、特定のタイプの名前空間であることを保証したい場合、
nstype に 0
以外の値を指定するとよい。
(ファイルディスクリプタが別の
プロセスによりオープンされ、例えば、UNIX
ドメインソケット経由で呼び出し
側に渡された場合などでは、呼び出し側が
fd
がどのタイプの名前空間を
参照しているかを知らない可能性がある。)
返り値¶
成功すると
setns() は 0
を返す。
失敗すると、 -1
が返され、
errno
にエラーを示す値が設定される。
エラー¶
- EBADF
- fd
が有効なファイルディスクリプタではない。
- EINVAL
- fd が nstype
で指定されたタイプと一致しない名前空間を参照している。
または、指定された名前空間をそのスレッドに関連付けし直す際に問題
があった。
- ENOMEM
- 指定された名前空間に変更するのに必要なメモリが割り当てられない。
- EPERM
- 呼び出したスレッドがこの操作を行うのに必要な特権
( CAP_SYS_ADMIN) を
持っていなかった。
バージョン¶
setns()
システムコールはカーネル
3.0 で Linux
に初めて登場した。
ライブラリによるサポートは
glibc バージョン 2.14
を追加された。
setns() システムコールは
Linux 固有である。
新しいスレッドが
clone(2)
を使って作成された際に共有できる全ての属性を、
setns()
を使って変更できるわけではない。
現在のところ、 PID
名前空間とマウント名前空間はサポートされていない
(
clone(2) の
CLONE_NEWPID と
CLONE_NEWNS
の説明を参照)。
関連項目¶
clone(2),
fork(2),
vfork(2),
proc(5),
unix(7)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。