一,概念
僵尸进程:如果一个进程通过fork()创建子了一个进程,当子进程退出而父进程还没有调用wait/waitpid来保存子进程的状态且回收它,此时子进程的状态描述信息仍然保留在系统中,称这类进程为僵尸进程;;僵尸进程的优点是方便上层进程得知子进程的退出状态,但是如果不及时回收会造成内存泄露;
孤儿进程:当一个父进程已经推出,而他的一个或多个子进程还在运行,则称这些子进程为孤儿进程,孤儿进程被初始化进程init(进程号为1)领养,并用初始化进程对其进行状态收集。
二 验证僵尸进程
给子进程加上exit()退出后成为僵尸进程,调用system("ps -o pid,ppid,state")可以看出子进程状态变为Z;
结果显示
三,验证孤儿进程;
和僵尸进程的验证方法类似,在子进程退出前退出父进程,由以下截图可以看出子进程成为孤儿进程后被一号进程领养;
四,注册顺序;
代码验证:
结果:
截取man atexit命令中对atexit的描述:
1,注册的函数将在程序结束之后调用:atexit - register a function to be called at normal process termination
2,函数原型:int atexit(void (*function)(void));
3,函数注册顺序与调用顺序相反:registered are called in the reverse order of their
registration; no arguments are passed.