子进程

在计算机领域中，子进程為由另外一個进程（对应称之为父进程）所创建的进程。子进程继承了父进程的大部分属性，例如文件描述符。

 产生 
在Unix中，子进程通常为系统调用fork的产物。在此情况下，子进程一开始就是父进程的副本，而在这之后，根据具体需要，子进程可以借助调用来另一程序。

 与父进程的关系 
一个进程可能下属多个子进程，但最多只能有1个父进程，而若某一进程没有父进程，则可知该进程很可能由内核直接生成。在Unix与类Unix系统中，进程ID为1的进程（即init进程）是在系统引导阶段由内核直接创建的，且不会在系统运行过程中终止执行（可参见Linux启动流程）；而对于其他无父进程的进程，则可能是为在用户空间完成各种后台任务而执行的。

当某一子进程结束、中断或恢复执行时，内核会发送SIGCHLD信号予其父进程。在默认情况下，父进程会以SIG_IGN函数忽略之。

 “孤儿进程”与“僵尸进程” 
在对应的父进程结束执行后，进程就会变成孤儿进程，但之后会立即由init进程“收养”为其子进程。

某一子进程终止执行后，若其父进程未提前调用wait，则内核会持续保留子进程的退出状态等信息，以使父进程可以wait获取之 。而因为在这种情况下，子进程虽已终止，但仍在消耗系统资源，所以其亦称僵尸进程。wait常于SIGCHLD信号的处理函数中调用。

 解决与预防 
在POSIX.1-2001标准规定中，父进程可将SIGCHLD的处理函数设为SIG_IGN（亦为默认设定），或为SIGCHLD设定SA_NOCLDWAIT标记，以使内核可以自动回收已终止的子进程的资源。自Linux 2.6与FreeBSD 5.0起，两种内核皆支持了这两种方式http://fuse4bsd.creo.hu/localcgi/maSA_NOCLDWAITSA_NOCLDWAITn-cgi.cgi?signal+3。但是，在忽略SIGCHLD信号的问题上，由于System V与BSD由来已久的差异，若要回收派生出的子进程的资源，调用wait仍是最便捷的方式。

 参见 

 ，以之可在UNIX系统中以pstree PID的方式查询PID对应进程之子进程

 参考资料 

Category:进程