父进程
在计算机科学中,父进程是指已经创建了一个或多个子进程的进程。
UNIX
在UNIX操作系统中,除了进程0(即PID=0的交换进程,Swapper Process)之外的所有进程都是通过系统调用fork创建的。在这个过程中,调用fork创建新进程的进程被称为父进程,而它创建出来的进程则称为子进程。因此,除了进程0外,每个进程都有且仅有一个父进程,但一个进程可能拥有多个子进程。操作系统内核使用进程标识符(Process Identifier,即PID)来唯一标识每个进程。进程0是系统启动时创建的一个特殊进程,在其调用fork创建出一个子进程(即PID=1的进程1,又称init)之后,进程0转变为交换进程(有时也称为空闲进程)。而进程1(init进程)成为了系统中所有其他进程的祖先。
进程生命周期
当一个子进程结束运行时,它的退出状态(返回值)会报告给操作系统,系统随后向父进程发送SIGCHLD信号,通知子进程已被结束。此时,子进程的进程控制块(PCB)仍然保留在内存中。通常情况下,父进程接收到SIGCHLD信号后,会使用wait系统调用来获取子进程的退出状态,接着内核便可以从内存中释放已完成的子进程的PCB。如果父进程未执行此操作,则子进程的PCB将继续保留在内存中,形成所谓的僵尸进程。孤儿进程指的是在其父进程结束后继续运行的子进程。在类unix系统中,这些孤儿进程通常会被init进程“收养”,从而成为init的子进程。为了避免产生僵尸进程,实践中常采用的方法包括:
- 将父进程对SIGCHLD信号的处理函数设置为SIG_IGN(忽略信号)。
- 通过fork两次并杀死一级子进程,使二级子进程成为孤儿进程,进而被init“收养”并清理。
Linux
在Linux内核中,进程和POSIX线程之间存在着细微的差异,这使得父进程的概念与UNIX有所不同。在Linux中,存在两种类型的父进程:形式父进程和实际父进程。对于一个子进程而言,其父进程是在子进程结束时接收SIGCHLD信号的进程,而实际父进程则是多线程环境中真正创建该子进程的进程。对于普通的非线程进程,父进程与实际父进程是相同的实体。然而,对于以进程形态存在的POSIX线程,父进程和实际父进程可能会不同。
参考资料
什么是子进程和父进程.什么是子进程和父进程.2024-11-27
进程控制(2): 进程操作.博客园.2024-11-27
概述.概述.2024-11-27