【问题标题】:Official doc of ALL cleanup steps after fork before exec执行前 fork 后所有清理步骤的官方文档
【发布时间】:2014-03-06 04:01:25
【问题描述】:

在 Unix 上,我知道在调用 fork() 之后,我需要在调用 exec() 之前重置我的信号掩码并关闭我不希望孩子拥有的文件描述符。

但是,我还需要做什么?

是否有一个全面的文档列出了在派生子进程时可能需要清理的所有内容,以便为其提供一个良好的标准执行环境?

我目前使用的是 Linux,但我想要一份包含其他 Unix 的详细信息的文档,可能包含对它们进行自动配置测试的方法。

【问题讨论】:

    标签: unix exec fork sigprocmask


    【解决方案1】:

    fork(3) 提供comprehensive list。在这里引用有点长,但根据 SO 政策,无论如何我都会这样做:

    fork() 函数将创建一个新进程。新流程(子 进程)应是调用进程(父进程)的精确副本 过程),以下详述除外:

    • 子进程应具有唯一的进程 ID。
    • 子进程 ID 也不得与任何活动进程组 ID 匹配。
    • 子进程应该有一个不同的父进程ID,它应该是调用进程的进程ID。
    • 子进程应拥有自己的父文件描述符副本。每个孩子的文件描述符都应引用 与对应的文件描述符相同的打开文件描述 父母。
    • 子进程应拥有自己的父进程打开目录流的副本。子进程中的每个打开的目录流可能 与对应目录共享目录流定位 父流。
    • 子进程应拥有自己的父消息目录描述符副本。
    • 子进程的 tms_utime、tms_stime、tms_cutime 和 tms_cstime 值应设置为 0。
    • 距离闹钟信号的剩余时间应重置为零,如果有闹钟,则应取消;请参阅警报()。
    • 应清除所有 semadj 值。
    • 父进程设置的文件锁不能被子进程继承。
    • 子进程的待处理信号集应初始化为空集。
    • 应在子进程中重置间隔计时器。
    • 在父进程中打开的任何信号量也应在子进程中打开。
    • 子进程不应继承父进程通过调用 mlockall() 或 mlock() 建立的任何地址空间内存锁。
    • 在父进程中创建的内存映射应保留在子进程中。从父级继承的 MAP_PRIVATE 映射也应 子中的 MAP_PRIVATE 映射,以及对数据的任何修改 在调用 fork() 之前由父级进行的这些映射中,应为 对孩子可见。对 MAP_PRIVATE 中数据的任何修改 在 fork() 返回后由父级创建的映射应仅可见 给父母。对 MAP_PRIVATE 映射中的数据进行了修改 应仅对孩子可见。
    • 对于 SCHED_FIFO 和 SCHED_RR 调度策略,子进程应继承父进程的策略和优先级设置 在 fork() 函数期间处理。对于其他调度策略, fork() 上的策略和优先级设置由实现定义。
    • 父进程创建的每进程计时器不应被子进程继承。
    • 子进程应拥有自己的父消息队列描述符副本。每个消息描述符 子节点应引用与子节点相同的打开消息队列描述 对应的父消息描述符。
    • 子进程不得继承任何异步输入或异步输出操作。
    • 应使用单个线程创建进程。如果多线程进程调用 fork(),则新进程应包含 调用线程及其整个地址空间,可能包括 互斥锁和其他资源的状态。因此,为避免错误, 子进程只能执行异步信号安全操作,直到 调用其中一个 exec 函数的时间。叉处理程序可能是 通过 pthread_atfork() 函数建立,以便 跨 fork() 调用维护应用程序不变量。当。。。的时候 应用程序从信号处理程序和任何 fork 调用 fork() pthread_atfork() 注册的处理程序调用的函数不是 异步信号安全,行为未定义。
    • 如果 Trace 选项和 Trace Inherit 选项都受支持:如果调用进程在跟踪流中被跟踪,该跟踪流具有 继承策略设置为 POSIX_TRACE_INHERITED,子进程 应被跟踪到该跟踪流中,并且子进程应 继承父级的跟踪事件名称到跟踪事件类型的映射 身份标识。如果调用进程所在的跟踪流 被跟踪的继承策略设置为 POSIX_TRACE_CLOSE_FOR_CHILD,不应跟踪子进程 进入该跟踪流。继承策略是通过调用 posix_trace_attr_setinherited() 函数。
    • 如果支持 Trace 选项,但不支持 Trace Inherit 选项:不应将子进程跟踪到任何 跟踪其父进程的流。
    • 如果支持 Trace 选项,则跟踪控制器进程的子进程不应控制由 其父进程。
    • 子进程的CPU时间时钟的初始值应设置为零。
    • 子进程单线程的CPU时间时钟初始值应设置为零。所有其他过程特性 由 IEEE Std 1003.1-2001 定义的父级和 子进程。过程特性的继承不 由 IEEE Std 1003.1-2001 定义 IEEE Std 未指定 1003.1-2001。

    【讨论】:

    • 这描述了我不必担心的所有事情。例如,关于信号掩码它并没有说什么,因为信号掩码是你需要自己清理的东西。我正在寻找既不是 fork() 也不是 exec() 为你处理的事情的列表。
    • 嗯,你说对了一部分。它确实提到了文件描述符、目录流和消息队列描述符作为潜在的担忧。
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多