unshare函数原型:
#define _GNU_SOURCE
#include <sched.h>
int unshare(int flags);
作用:分离进程执行上下文的各个部分,允许进程(或线程)解除当前与其他进程(或线程)部分共享的执行上下文;
unshare() 允许进程在不创建新进程的情况下控制(主要是取消共享)其共享的执行上下文。
当使用 fork(2) 或 vfork(2) 创建新进程时,有的执行上下文,比如命名空间是隐式共享的,即如果你不显式的指定,那么默认创建的子进程或子线程都在同一个命名空间当中。
使用clone(2)创建进程或者线程式,有的执行上下文,比如虚拟内存需要显式的指定。
在使用 clone(2) 创建新进程时,并非所有可以共享的进程属性都可以使用 unshare() 取消共享。 特别是,在内核 3.8 中,unshare() 没有实现反转 CLONE_SIGHAND、CLONE_THREAD 或 CLONE_VM 的影响的标志。 如果需要,将来可能会添加此类功能。
flags
参数是一个位掩码,它指定执行上下文的哪些部分应该被取消共享。
如果 flags 指定为零,则 unshare() 是空操作; 没有对调用进程的执行上下文进行任何更改。
此参数通过将零个或多个以下常量组合在一起指定:
- CLONE_FILES
取消共享文件描述符表,以便调用进程不再与任何其他进程共享文件描述符。 - CLONE_FS
取消共享文件系统属性,以便调用进程不再与任何其他进程共享其根目录 (chroot(2))、当前目录 (chdir(2)) 或 umask (umask(2)) 属性。 - CLONE_NEWCGROUP
取消共享 cgroup 命名空间。 该标志需要 CAP_SYS_ADMIN capability。 - CLONE_NEWIPC
取消共享 IPC 命名空间,以便调用进程拥有IPC 命名空间的私有副本且不与任何其他进程共享 。指定此标志也会自动指定 CLONE_SYSVSEM标志。该标志需要 CAP_SYS_ADMIN capability。 - CLONE_NEWNET
取消共享网络名称空间,以便将调用进程移动到一个新的网络名称空间中,该名称空间不与任何先前存在的进程共享。该标志需要 CAP_SYS_ADMIN capability。 - CLONE_NEWNS
取消共享Mount命名空间,以便调用进程拥有其命名空间的私有副本,且不与任何其他进程共享。该标志需要 CAP_SYS_ADMIN capability。 - CLONE_NEWPID
取消共享 PID 名称空间,以便调用进程为其子进程拥有一个新的 PID 名称空间,该名称空间不与任何先前存在的进程共享。调用进程不会移动到新的命名空间中。调用进程创建的第一个子进程将具有进程 ID 1,并将在新命名空间中