unshare与setns函数

本文详细介绍了Linux中的unshare和setns函数,用于进程执行上下文的隔离和加入已有命名空间。unshare函数允许进程取消共享执行上下文的各个部分,如文件描述符、文件系统、命名空间等,而setns函数则让进程可以加入已存在的命名空间。内容包括函数原型、参数解析、命令用法及案例,展示了这两个函数在系统管理、容器和命名空间操作中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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() 是空操作; 没有对调用进程的执行上下文进行任何更改。

此参数通过将零个或多个以下常量组合在一起指定:

  1. CLONE_FILES
    取消共享文件描述符表,以便调用进程不再与任何其他进程共享文件描述符。
  2. CLONE_FS
    取消共享文件系统属性,以便调用进程不再与任何其他进程共享其根目录 (chroot(2))、当前目录 (chdir(2)) 或 umask (umask(2)) 属性。
  3. CLONE_NEWCGROUP
    取消共享 cgroup 命名空间。 该标志需要 CAP_SYS_ADMIN capability。
  4. CLONE_NEWIPC
    取消共享 IPC 命名空间,以便调用进程拥有IPC 命名空间的私有副本且不与任何其他进程共享 。指定此标志也会自动指定 CLONE_SYSVSEM标志。该标志需要 CAP_SYS_ADMIN capability。
  5. CLONE_NEWNET
    取消共享网络名称空间,以便将调用进程移动到一个新的网络名称空间中,该名称空间不与任何先前存在的进程共享。该标志需要 CAP_SYS_ADMIN capability。
  6. CLONE_NEWNS
    取消共享Mount命名空间,以便调用进程拥有其命名空间的私有副本,且不与任何其他进程共享。该标志需要 CAP_SYS_ADMIN capability。
  7. CLONE_NEWPID
    取消共享 PID 名称空间,以便调用进程为其子进程拥有一个新的 PID 名称空间,该名称空间不与任何先前存在的进程共享。调用进程不会移动到新的命名空间中。调用进程创建的第一个子进程将具有进程 ID 1,并将在新命名空间中
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值