深入认识《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。其代码和结果如图:

图一:test.c
图二:实验结果
  针对上述实验现象,我们发现exit的作用就是退出进程,我们的main函数最后使用exit退出,而我们得到的进程退出码,也是exit的实参,在这一点上,exit和return是一样的,我们更换场景,如图:
图一:test.c
图二:实验结果
  针对改进后的实验,我们发现exit在show函数中,我们main函数最后一句代码(game over)没有打印,这说明什么,说明该进程在show函数中执行到exit就退出了,所以没有继续执行main函数最后的代码;并且此时进程退出码也是我们设置的123,说明进程是走到exit()函数正常退出的。

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

总结: exit和main函数的return在终止进程这件事上是等价的,不过exit在任何地方调用都可以让进程终止,而我们在其他函数中调用return,只是让该函数运行完毕。

_exit()

  这个函数我们可能没怎么见过,我们还是先查看该函数的使用手册进行查看。

1、查看_exit()函数的使用手册

  该函数有两种形式,差别只是首字母的大小写,其功能和使用方法是一模一样的,我们以_exit()为例进行讲解。

2、代码示例_exit()
  我们对exit()中的两个例子中的exit直接改为_exit,发现实验结果是一模一样的,与exit()函数没有任何差异。其代码和结果如图。

图一:test.c
图二:实验结果
图一:test.c
图二:实验结果

那么此时能不能下结论,exit()和_exit()没有任何差别,这两个函数一模一样!!!本博客到此结束。

  这是万万不能的,如果到此就结束,两个函数没有任何区别,这篇博客也就没有任何价值了。我们知道显示器和内存都有自己的缓冲和刷新规则,我们的显示器采用的是行缓冲和行刷新,这个知识点在小编的另一篇文章中讲过,大家对这方面不懂得可以去查看《搞懂缓冲区,这篇文章就够了》。

exit() VS _exit()

1、代码示例
  我们继续修改代码,这里我们采用C语言书写代码比较方便,我们将C中的换行符"\\n"去掉,继续观察实验现象。

图一:test.c
图二:实验结果
  现象:显示器停顿3秒,然后打印hello world,程序结束,且退出码为111。

  解释:我们执行打印hello every readers!时,hello every readers!在输出缓冲区当中,因为没有\\n,所以字符串没有立即打印,当我们调用sleep(2)的时候,该字符串还是没有刷新出来,exit代表进程退出,进程退出的时候会刷新相关数据,exit不是不负责任的直接退出了,而是把曾经没来得及处理的缓冲区中的数据刷新出来。

同样的代码,把exit改成_exit,其代码和运行结果如下:

图一:test.c
图二:实验结果
现象:程序等待2秒结束,结束的时候退出码是111没有问题,但是缓冲区中的数据并没有被刷新出来。

2、结论
exit会释放进程曾经占用的资源,比如缓冲区,而_exit直接终止进程,不会做任何收尾工作。
🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥

以上是关于深入认识《exit VS _exit》的主要内容,如果未能解决你的问题,请参考以下文章

如何退出子进程 - _exit() 与 exit

exit()子程序终止函数与return()函数的差别

Winforms:Application.Exit vs Environment.Exit vs Form.Close

Linux-exit函数-_exit函数-atexit函数-刷新缓冲区的方式

python中的__enter__ __exit__

进程管理详解