C语言: exit()函数与_exit()函数的区别:
exit()函数在调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件;
_exit()直接使进程停止运行,清除其使用的内存空间,并销毁在内核中的各种数据结构。
在Linux的标准函数库中,有一套称为“高级I/O”的函数,如printf、fopen、fread、fwrite,它们被称为“缓冲I/O(buffered I/O)”, 其特征是对应每一个找开的文件,在内存中都有一个缓冲区,每次读文件时,会先从文件中多读出若干条记录到缓冲区,这样下次读时就可以直接从内存的缓冲区中读取,每次写文件时,也是先入缓冲区,等满足一定的条件时(比如:达到一定数量,或遇到换行符'\n'和文件结束符EOF),再将缓冲区中的内容一次性写入文件,这样就可提高文件读写的速度。但请注意,如果有一些数据,我们认为已经写入了文件,但实际上因为没有满足特写的条件,它们还只是保存在缓冲区,这时如用_exit()函数直接关闭进程,缓冲区中的数据就会丢失。如想保证数据的完整性,一定要
用exit()函数。
下面程序是在Linux 2.6 下用gcc编译的
例子1:
#include <stdio.h>
main(){
printf("hello, world!\n");
exit(0);
printf("hello, sky~"); //不会显示
}
显示结果:hello, world!
例子2:
#include <stdio.h>
main(){
printf("hello, world!");
_exit(0);
printf("hello, sky~"); //不会显示
}
显示结果:什么也没有。
分析结果:
1. printf()函数在遇到换行符'\n'时才从缓冲区读取数据
2. 在例子1中exit(0)在使程序退出之前,先将缓冲区中的内容写到标准输出;(此处的标准输出是指屏幕)
exit()函数在调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件;
_exit()直接使进程停止运行,清除其使用的内存空间,并销毁在内核中的各种数据结构。
在Linux的标准函数库中,有一套称为“高级I/O”的函数,如printf、fopen、fread、fwrite,它们被称为“缓冲I/O(buffered I/O)”, 其特征是对应每一个找开的文件,在内存中都有一个缓冲区,每次读文件时,会先从文件中多读出若干条记录到缓冲区,这样下次读时就可以直接从内存的缓冲区中读取,每次写文件时,也是先入缓冲区,等满足一定的条件时(比如:达到一定数量,或遇到换行符'\n'和文件结束符EOF),再将缓冲区中的内容一次性写入文件,这样就可提高文件读写的速度。但请注意,如果有一些数据,我们认为已经写入了文件,但实际上因为没有满足特写的条件,它们还只是保存在缓冲区,这时如用_exit()函数直接关闭进程,缓冲区中的数据就会丢失。如想保证数据的完整性,一定要
用exit()函数。
下面程序是在Linux 2.6 下用gcc编译的
例子1:
#include <stdio.h>
main(){
printf("hello, world!\n");
exit(0);
printf("hello, sky~"); //不会显示
}
显示结果:hello, world!
例子2:
#include <stdio.h>
main(){
printf("hello, world!");
_exit(0);
printf("hello, sky~"); //不会显示
}
显示结果:什么也没有。
分析结果:
1. printf()函数在遇到换行符'\n'时才从缓冲区读取数据
2. 在例子1中exit(0)在使程序退出之前,先将缓冲区中的内容写到标准输出;(此处的标准输出是指屏幕)
3. 在例子2中_exit(0),直接将缓冲区里的内容清洗了。
总结《Linux C编程 从初学到精通》