父进程和子进程

发布时间:2024-01-15
系统运维
父进程
在计算机领域,父进程(英语:parent process)指已创建一个或多个子进程的进程。
unix
在unix里,除了进程0(即pid=0的交换进程,swapper process)以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程。
操作系统内核以进程标识符(process identifier,即pid)来识别进程。进程0是系统引导时创建的一个特殊进程,在其调用fork创建出一个子进程(即pid=1的进程1,又称init)后,进程0就转为交换进程(有时也被称为空闲进程),而进程1(init进程)就是系统里其他所有进程的祖先。
僵尸进程与孤儿进程
当一个子进程结束运行(一般是调用exit、运行时发生致命错误或收到终止信号所导致)时,子进程的退出状态(返回值)会回报给操作系统,系统则以sigchld信号将子进程被结束的事件告知父进程,此时子进程的进程控制块(pcb)仍驻留在内存中。一般来说,收到sigchld后,父进程会使用wait系统调用以获取子进程的退出状态,然后内核就可以从内存中释放已结束的子进程的pcb;而如若父进程没有这么做的话,子进程的pcb就会一直驻留在内存中,也即成为僵尸进程。
孤儿进程则是指父进程结束后仍在运行的子进程。在类unix系统中,孤儿进程一般会被init进程所“收养”,成为init的子进程。
为避免产生僵尸进程,实际应用中一般采取的方式是:
将父进程中对sigchld信号的处理函数设为sig_ign(忽略信号);
fork两次并杀死一级子进程,令二级子进程成为孤儿进程而被init所“收养”、清理。
linux
在linux内核中,进程和posix线程有着相当微小的区别,父进程的定义也与unix不尽相同。linux有两种父进程,分别称为(形式)父进程与实际父进程,对于一个子进程来说,其父进程是在子进程结束时收取sigchld信号的进程,而实际父进程则是在多线程环境里实际创建该子进程的进程。对于普通进程来说,父进程与实际父进程是同一个进程,但对于一个以进程形式存在的posix线程,父进程和实际父进程可能是不一样的。
子进程
在计算机领域中,子进程为由另外一个进程(对应称之为父进程)所创建的进程。子进程继承了父进程的大部分属性,例如文件描述符。
产生
在unix中,子进程通常为系统调用fork的产物。在此情况下,子进程一开始就是父进程的副本,而在这之后,根据具体需要,子进程可以借助exec调用来链式加载另一程序。
与父进程的关系
一个进程可能下属多个子进程,但最多只能有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起,两种内核皆支持了这两种方式。但是,在忽略sigchld信号的问题上,由于system v与bsd由来已久的差异,若要回收派生出的子进程的资源,调用wait仍是最便捷的方式。
我们的公共号
上一个:什么是快速建站?快速建站方法有哪些?
下一个:想要畅玩游戏游戏笔记本该怎么升级系统(想要畅玩游戏游戏笔记本该怎么升级)

Gartner发布了2020年全球公有云魔力象限研究报告
农村卖房过户需要什么手续
美甲店营业执照怎么办理
投诉企业偷税漏税需要提供证据吗
案件移送必须在同级之间吗
如何理解监护制度
如何证明公司与母公司的关系
18世纪欧洲大陆茶叶的再出口
光纤OTDR测试与光损耗测试的区别
用流量分析仪进行网络测试