进程是如何结束与回收的

大致描述进程创建的过程,系统中有一个叫做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
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值