linux下exit与_exit的区别

来源:互联网 发布:sql 别名 as 编辑:程序博客网 时间:2024/05/01 08:39

1、exit与_exit函数的说明

这两个函数都是用来终止进程的。程序执行到exit或者_exit时,进程都会无聊见的停止剩下的所有操作,清除包括PCB在内的数据结构,并终止本进程的运行。但这两个函数还是有区别的。

exit:进程运行--->调用退出处理函数--->清理I/O缓冲--->调用exit系统调用--->程序终止运行。

_exit:进程运行--->调用exit系统调用--->程序终止运行。


由上面的流程可以看出来,该2个函数的最大区别就是:exit函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是上述的“清理I/O缓存”。


在Linux标准函数库中,有一种称作“缓冲I/O”操作:没打开一个文件,在内存中都有一片缓冲区。每次读写文件,都会连续读写若干条记录,下次读写文件就直接从内存缓冲区中读写,写操作则在满足一定条件之后,一次性写入文件。这样增加了文件读写速度,但会给编程带来一定麻烦,如果有一些数据,认为已经写入了文件,实际上还是在缓存区内,这时候调用_exit函数关闭进程,缓冲区中的数据就会丢失。因此,若想保证数据的完整性,就一定要用exit函数。


2、exit和_exit函数的使用实例:

#include <stdio.h>#include <stdlib.h>int mian(){    printf("Using exit...\n");    printf("This is the conten in buffer");    exit(0);}[root@(none)]#./exitUsing exit...This is the conten in buffer[root@(none)]#

调用exit函数时,缓冲区中的记录也能正常输出。


我们看看实例2:

#include <stdio.h>#include <stdlib.h>int mian(){    printf("Using exit...\n");    printf("This is the conten in buffer");    _exit(0);}[root@(none)]#./_exitUsing exit...[root@(none)]#

调用_exit函数无法输出缓冲区的记录。


小知识:

在一个进程调用exit之后,该进程并不会马上完全消失,而是留下一个成为僵尸进程的数据结构。僵尸进程时一种特殊的进程,它几乎已经放弃所有的内存空间,没有任何执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不在占有任何内存空间。

原创粉丝点击