深入认识《exit VS _exit》
Posted 做1个快乐的程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入认识《exit VS _exit》相关的知识,希望对你有一定的参考价值。
exit VS _exit
一个进程退出有三种场景:a.代码运行完毕,结果正确;b.代码运行完毕,结果不正确;c.代码异常终止。我们进程的退出的方法也分为两大类:正常终止和异常终止。 其中 进程正常终止的方法又分为:a.return返回;b.exit();c._exit()。进程异常终止就是收到终止信号。
今天带大家来学习两个函数,就是完成进程正常退出的两个函数,exit和_exit。本篇博客是通过实际代码一步一步推出结论,大家不可只读文字,需要结合图片中的代码一同观看。
exit()
1、查看exit()函数的使用手册
查看手册我们知道,exit()函数就是完成进程的终止工作的,它包含的头文件和函数的参数如图中所示,exit()函数的返回值为void类型,形参是一个int类型的status,就是返回值,该进程结束,我们返回值是供父进程wait/waitpid的,父进程来获取我们当前进程的状态信息。
2、代码示例exit()
我们实际代码来观察exit函数,小编之前的文章提过echo $?。这个命令是用来获取最近一次进程的退出码信息,如果退出码为0,代表进程正常退出;退出码非0代表进程异常退出,异常退出就表示进程收到了信号,这里了解即可,而非0又有多种,不同的数字代表不同的错误信息。echo $?示例如图:
了解了这些,我们就写实际代码来测试exit。其代码和结果如图:
|
|
|
|
❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️
总结: exit和main函数的return在终止进程这件事上是等价的,不过exit在任何地方调用都可以让进程终止,而我们在其他函数中调用return,只是让该函数运行完毕。
_exit()
这个函数我们可能没怎么见过,我们还是先查看该函数的使用手册进行查看。
1、查看_exit()函数的使用手册
该函数有两种形式,差别只是首字母的大小写,其功能和使用方法是一模一样的,我们以_exit()为例进行讲解。
2、代码示例_exit()
我们对exit()中的两个例子中的exit直接改为_exit,发现实验结果是一模一样的,与exit()函数没有任何差异。其代码和结果如图。
|
|
|
|
那么此时能不能下结论,exit()和_exit()没有任何差别,这两个函数一模一样!!!本博客到此结束。
这是万万不能的,如果到此就结束,两个函数没有任何区别,这篇博客也就没有任何价值了。我们知道显示器和内存都有自己的缓冲和刷新规则,我们的显示器采用的是行缓冲和行刷新,这个知识点在小编的另一篇文章中讲过,大家对这方面不懂得可以去查看《搞懂缓冲区,这篇文章就够了》。
exit() VS _exit()
1、代码示例
我们继续修改代码,这里我们采用C语言书写代码比较方便,我们将C中的换行符"\\n"去掉,继续观察实验现象。
|
|
解释:我们执行打印hello every readers!时,hello every readers!在输出缓冲区当中,因为没有\\n,所以字符串没有立即打印,当我们调用sleep(2)的时候,该字符串还是没有刷新出来,exit代表进程退出,进程退出的时候会刷新相关数据,exit不是不负责任的直接退出了,而是把曾经没来得及处理的缓冲区中的数据刷新出来。
同样的代码,把exit改成_exit,其代码和运行结果如下:
|
|
2、结论
exit会释放进程曾经占用的资源,比如缓冲区,而_exit直接终止进程,不会做任何收尾工作。
🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
以上是关于深入认识《exit VS _exit》的主要内容,如果未能解决你的问题,请参考以下文章
Winforms:Application.Exit vs Environment.Exit vs Form.Close