在Unix上,我知道在调用fork()之后,我需要在调用exec()之前重置我的信号掩码并关闭我不想让孩子拥有的文件描述符。
但是,我还需要做什么呢?
是否有一个全面的文档,列出了在分配子进程时可能要清理的所有内容,以便为其提供良好的标准执行环境?
我目前在Linux上,但我想要一个包含其他Unix的详细信息的文档,可能还有自动测试它们的方法。
答案 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。