操作系统 — 进程的退出(exit)

进程退出





linux下正常的退出方式:

1.在main函数中使用了return返回. (return之后把控制权交给调用函数)

2.调用exit()或者_exit; (exit()之后把控制权交给系统)

异常退出:

1.调用abort函数

2.进程收到某个信号,而该信号是程序中止.

不管是哪一种退出方式,最后都会执行内核中的同一代码,这段代码用来关闭进程所用到的已经打开的文件描述符所占用的内存和资源.


exit和_exit函数说明



创建进程使用fork()函数,执行进程使用exec函数族,终止进程则使用_exit()和exit()函数. 当进程执行到exit()或_exit()函数时,进程会无条件的

止剩下的所有操作,清楚各种数据结构,并终止本进程的运行. 但是,这两个函数还是有区别的. 他们的调用过程如下:




从图里可以看出来,_exit()函数的作用是: 直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构; 而exit()函数则在这

些基础上做了一些包装,在执行退出之前加了若干道工序. exit()函数和_exit()函数的最大区别就在于exit()函数在终止当前进程之前要检查该进程

打开过那些文件,把文件缓冲区中的内容写回文件,也就是图中的 "清楚I/O缓冲" 一项.


在Linux的标准函数库中,有一种被称为 "缓冲I/O" 的操作,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区. 每次读文件时,会联系读

出若干条记录,这样在下次读文件时就可以直接从内存的缓冲区当中读取; 同样的,每次写文件的时候,也仅仅是写入内存的 缓冲区,等满足了一定的

条件时(如达到一定数量或遇到特定字符等,最典型的就是咱们的vim中使用的 : w命令),再将缓冲区中的内容一次性写入文 件.

这种技术大大增加了文件读写的速度,但是也给编程带来了一点麻烦. 比如有些数据你认为已经被写入到文件中,实际上因为没有满足特定的条件,他

们还只是被保存在缓冲区内,这时用_exit()函数直接将进程关闭掉,缓冲区中的数据就会丢失. 因此,为了数据的完整性,请使用exit()函数.


各种退出方式的比较:



1.exit和return的比较,exit是一个函数,有参数.而return是函数执行完毕后的返回. exit把控制权交给系统,而return将控制权交给调用函数.

2.exit和abort的区别: exit是正常终止进程,而abort是异常终止.

3.exit和_exit的区别:



4.exit中的参数 如果为0代表进程正常终止,如果为其他值表示程序执行过程有错误发生,比如除数为0.


代码演示:


我们来使用代码来看看exit和_exit的区别呢~ 我们先认识一个操作,如果你想知道上一个程序的退出码是什么东西. 在linux下的指令行输入: 

echo $? 就可以查看上一个程序的退出码了. 现在我们看下面的代码:



这个时候我们知道的exit在退出的时候,会刷新内存缓冲区,所以两句话都会打印出来,并且退出码为2.



然后我们在来看_exit的情况:



_exit会直接结束掉进程,所以呢我们可以看到第一句话,第二句不会出现在显示屏上. 退出码为2.

相关文章
相关标签/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院