在exec之前的fork后,所有清理步骤的官方文档

时间:2014-02-08 18:09:36

标签: unix exec fork sigprocmask

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

但是,我还需要做什么呢?

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

我目前在Linux上,但我想要一个包含其他Unix的详细信息的文档,可能还有自动测试它们的方法。

1 个答案:

答案 0 :(得分:0)

fork(3)提供comprehensive list。这里引用的时间有点长,但根据SO政策我还是会这样做:

  

fork()函数应创建一个新进程。新的过程(孩子   process)应该是调用进程的精确副本(父进程)   过程)除了详述如下:

     
      
  • 子进程应具有唯一的进程ID。
  •   
  • 子进程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()上的策略和优先级设置是实现定义的。
  •   
  • 父进程创建的每进程计时器不应由子进程继承。
  •   
  • 子进程应拥有自己的父进程的消息队列描述符的副本。每个消息描述符   child应引用与之相同的开放消息队列描述   父母的相应消息描述符。
  •   
  • 子进程不应继承异步输入或异步输出操作。
  •   
  • 应使用单个线程创建进程。如果多线程进程调用fork(),则新进程应包含该副本   调用线程及其整个地址空间,可能包括   互斥和其他资源的状态。因此,为了避免错误,   子进程可能只执行异步信号安全操作,直到   调用exec函数之一的时间。叉子处理程序可能是   通过pthread_atfork()函数建立的   跨fork()调用维护应用程序不变量。当。。。的时候   应用程序从信号处理程序和任何fork调用fork()   pthread_atfork()注册的处理程序调用的函数不是   asynch-signal-safe,行为未定义。
  •   
  • 如果同时支持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未标明   1003.1-2001。
  •