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,
}