关于进程:进程最后的遗言
过程最初的遗嘱前言在本篇文章当中次要给大家介绍父子过程之间的关系,以及他们之间的交互以及可能造成的状态,帮忙大家深刻了解父子过程之间的关系,以及他们之间的交互。 僵尸过程和孤儿过程僵尸过程在 Unix 操作系统和类 Unix 操作系统当中,当子过程退出的时候,父过程能够从子过程当中获取子过程的退出信息,因而在 类 Unix 操作系统当中只有父过程通过 wait 零碎调用读取子过程的退出状态信息之后,子过程才会齐全退出。那么子过程在程序执行实现之后(调用 _exit 零碎调用之后),到父过程执行 wait 零碎调用获取子过程退出状态信息之前,这一段时间的过程的状态是僵尸过程的状态。 正式定义:在 Unix 或者类 Unix 操作系统当中,僵尸过程就是哪些曾经实现程序的执行(实现_exit 零碎调用退出了程序),然而在内核当中还有属于这个过程的过程表项。这个表项的作用次要是让父过程读取子过程的退出状态信息 (exit status)。 在后文当中咱们有一个例子详细分析这个退出状态的相干信息。一旦父过程通过 wait 零碎调用读取完子过程的 exit statis 信息之后,僵尸过程的过程表项就会从过程表(process table)当中被移除,这个过程就算是彻底沦亡了(reaped)。 如果零碎当中有很多处于僵尸状态的过程而父过程又没有应用 wait 零碎调用去失去子过程的退出状态,那么零碎当中就会有很多内存没有被开释,这就会导致资源泄露。 上面是一个僵尸过程的例子,对应的代码名称为 Z.c: #include <stdio.h>#include <unistd.h>int main() { printf("parent pid = %d\n", getpid()); if(fork()) { while(1); } printf("child process pid = %d\n", getpid()); return 0;}下面C语言对应的python代码如下: import osif __name__ == "__main__": print(f"parent pid = {os.getpid()}") pid = os.fork() if pid != 0: # parent process will never exit while True: pass # child process will exit print(f"child process pid = {os.getpid()}")当初执行下面的程序,失去的后果如下所示: ...