进程是如何结束与回收的

2019-07-14 12:21发布

大致描述进程创建的过程,系统中有一个叫做init的初始进程,由它调用fork产生子进程(完全拷贝父进程的一切堆栈,代码,数据,文件资源等),子进程使用exec装载磁盘中的elf文件,更换自己的程序(包括代码段和数据段)。 进程的退出必须要使用exit(),exit()不是一个语言上的返回,它是一个系统调用,会释放当前的内存,文件资源等,但是此时pcb还未回收,只是一个僵尸进程,父进程使用wait()得知子进程进行exit()后,获取返回值,最终pcb就也被回收,一个进程才算完全退出。 如果父进程没有进行wait()子进程就先exit了,在exit的时候父进程的所有子进程都会被过继到init进程负责wait()。 对于不使用exit()而使用return的进程来说,也不用担心最终pcb会不被回收,永远变成僵尸进程,因为:
(以下内容来自于知乎) 每个C程序的入口点_start处的代码用伪代码表示为 _start: call __libc_init_first // 一些初始化 call _init call atexit call main call _exit 从伪代码就看出来了,每个C程序都要在执行一些初始化函数后对main调用,若main末尾为return语句,那么控制返回,最终会call _exit,把控制返回系统。若省略return,那么也将会call _exit。如果代码中有exit函数,那么会先执行atexit注册的函数,进而执行_exit()把控制还给操作系统。总之,这些情况下,当main返回,控制会传给系统 作者:徐丽 链接:https://www.zhihu.com/question/26591968/answer/33385228 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。