当前位置:K88软件开发文章中心电脑基础基础应用03 → 文章内容

Linux下exit命令和_exit命令区别盘点

减小字体 增大字体 作者:华军  来源:不详  发布时间:2019-1-30 23:10:00

  在Linux系统的命令中,作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中找到答案,感兴趣的朋友可以参考下。  注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS);可读性比较好一点。  作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中找到答案:  #define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h第334行 */  “__NR_”是在Linux的源码中为每个系统调用加上的前缀,请注意第一个exit前有2条下划线,第二个exit前只有1条下划线。 这时随便一个懂得C语言并且头脑清醒的人都会说,_exit和exit没有任何区别,但我们还要讲一下这两者之间的区别,这种区别主要体现在它们在函数库中的定义。_exit在Linux函数库中的原型是:  #i nclude《unistd.h》 void _exit(int status);  和exit比较一下,exit()函数定义在stdlib.h中,而_exit()定义在unistd.h中,从名字上看,stdlib.h似乎比 unistd.h高级一点,那么,它们之间到底有什么区别呢? _exit()函数的作用最为简单:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit() 函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序,也是因为这个原因,有些人认为exit已经不能算是纯粹的系统调用。 exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是“清理I/O缓冲”。  exit()在结束调用它的进程之前,要进行如下步骤:  1.调用atexit()注册的函数(出口函数);按ATEXIT注册时相反的顺序调用所有由它注册的函数,这使得我们可以指定在程序终止时执行自己的清理动作。例如,保存程序状态信息于某个文件,解开对共享数据库上的锁等。  2.cleanup();关闭所有打开的流,这将导致写所有被缓冲的输出,删除用TMPFILE函数建立的所有临时文件。  3.最后调用_exit()函数终止进程。  _exit做3件事(man): 1,Any open file descriptors belonging to the process are closed 2,any children of the process are inherited by process 1, init 3,the process‘s parent is sent a SIGCHLD signal  exit执行完清理工作后就调用_exit来终止进程。  此外,另外一种解释:  简单的说,exit函数将终止调用进程。在退出程序之前,所有文件关闭,缓冲输出内容将刷新定义,并调用所有已刷新的“出口函数”(由atexit定义)。  _exit:该函数是由Posix定义的,不会运行exit handler和signal handler,在UNIX系统中不会flush标准I/O流。  简单的说,_exit终止调用进程,但不关闭文件,不清除输出缓存,也不调用出口函数。  共同:  不管进程是如何终止的,内核都会关闭进程打开的所有file descriptors,释放进程使用的memory!       以上就是现编总结的区别盘点,希望能帮助到大家,了解更多资讯尽在华军软件园! 

Linux下exit命令和_exit命令区别盘点