⑴在Linux系统的命令中,exit命令和_exit命令看似相同实则有着不同的作用,那么exit命令和_exit命令具体有哪些区别呢?一起来了解下吧。
⑵注:exit(就是退出,传入的参数是程序退出时的状态码,表示正常退出,其他表示非正常退出,一般都用-或者,标准C里有EXIT_SUESS和EXIT_FAILURE两个宏,用exit(EXIT_SUESS;可读性比较好一点。
⑶作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中找到答案:
⑷#define __NR__exit __NR_exit /* 摘自文件include/asm-i/unistd.h第行 */
⑸“__NR_”是在Linux的源码中为每个系统调用加上的前缀,请注意第一个exit前有条下划线,第二个exit前只有条下划线。 这时随便一个懂得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(在结束调用它的进程之前,要进行如下步骤:
⑼.调用atexit(注册的函数(出口函数;按ATEXIT注册时相反的顺序调用所有由它注册的函数,这使得我们可以指定在程序终止时执行自己的清理动作。例如,保存程序状态信息于某个文件,解开对共享数据库上的锁等。
⑽.cleanup(;关闭所有打开的流,这将导致写所有被缓冲的输出,删除用TMPFILE函数建立的所有临时文件。
⑾.最后调用_exit(函数终止进程。
⑿_exit做件事(man: ,Any open file descriptors belonging to the process are closed ,any children of the process are inherited by process , init ,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!