1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
//! clone 任务时指定的参数。
use bitflags::*;
bitflags! {
/// 用于 sys_clone 的选项
#[derive(Debug, Clone, Copy)]
pub struct CloneFlags: u32 {
/// .
const CLONE_NEWTIME = 1 << 7;
/// 共享地址空间
const CLONE_VM = 1 << 8;
/// 共享文件系统新信息
const CLONE_FS = 1 << 9;
/// 共享文件描述符(fd)表
const CLONE_FILES = 1 << 10;
/// 共享信号处理函数
const CLONE_SIGHAND = 1 << 11;
/// 创建指向子任务的fd,用于 sys_pidfd_open
const CLONE_PIDFD = 1 << 12;
/// 用于 sys_ptrace
const CLONE_PTRACE = 1 << 13;
/// 指定父任务创建后立即阻塞,直到子任务退出才继续
const CLONE_VFORK = 1 << 14;
/// 指定子任务的 ppid 为当前任务的 ppid,相当于创建“兄弟”而不是“子女”
const CLONE_PARENT = 1 << 15;
/// 作为一个“线程”被创建。具体来说,它同 CLONE_PARENT 一样设置 ppid,且不可被 wait
const CLONE_THREAD = 1 << 16;
/// 子任务使用新的命名空间。目前还未用到
const CLONE_NEWNS = 1 << 17;
/// 子任务共享同一组信号量。用于 sys_semop
const CLONE_SYSVSEM = 1 << 18;
/// 要求设置 tls
const CLONE_SETTLS = 1 << 19;
/// 要求在父任务的一个地址写入子任务的 tid
const CLONE_PARENT_SETTID = 1 << 20;
/// 要求将子任务的一个地址清零。这个地址会被记录下来,当子任务退出时会触发此处的 futex
const CLONE_CHILD_CLEARTID = 1 << 21;
/// 历史遗留的 flag,现在按 linux 要求应忽略
const CLONE_DETACHED = 1 << 22;
/// 与 sys_ptrace 相关,目前未用到
const CLONE_UNTRACED = 1 << 23;
/// 要求在子任务的一个地址写入子任务的 tid
const CLONE_CHILD_SETTID = 1 << 24;
}
}
/// sys_wait4 的返回值
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WaitStatus {
/// 子任务正常退出
Exited,
/// 子任务正在运行
Running,
/// 找不到对应的子任务
NotExist,
}