网站推他网站wordpress教程登陆
news/
2025/9/29 10:28:24/
文章来源:
网站推他网站,wordpress教程登陆,个人公众号怎么开通,门户网站建设 考核1.为什么要有缓冲区
缓冲区分成语言层面的缓冲区和操作系统层面的缓冲区
先说结论#xff0c;语言的缓冲区可以减少系统调用的次数进而提高向文件写入和读取的效率。
2.举例子
向屏幕打印#xff0c;无非就是向屏幕这个文件的缓冲区写入#xff0c;然后在由操作系统刷新…1.为什么要有缓冲区
缓冲区分成语言层面的缓冲区和操作系统层面的缓冲区
先说结论语言的缓冲区可以减少系统调用的次数进而提高向文件写入和读取的效率。
2.举例子
向屏幕打印无非就是向屏幕这个文件的缓冲区写入然后在由操作系统刷新到显示器文件这样显示器就可以显示内容了。
#includeunistd.h2 #includesys/stat.h3 #includesys/types.h4 #includefcntl.h5 6 int main()7 {8 char s[] hello buffer\n;9 write(1,s,sizeof(s)); //显示器文件默认打开fd 110 return 0;11 }
直接调用系统调用写到显示器文件的缓冲区然后由操作系统刷新。
3.c语言缓冲区
将文件的缓冲区写入这件事一定是由系统调用接口做的而系统调用是有消耗的所以在调用printf时会将数据写入c语言本身的缓冲区然后根据刷新策略由系统调用将c语言缓冲的内容刷新到文件的缓冲区再由操作系统将文件缓冲区刷新到文件中。
这就好比我想申请100字节的空间一次malloc(100)肯定会比10次mallc(10)更高效。
c语言各种文件接口一定是对系统调用的封装因为不仅仅要引入缓冲区还要保证不同平台之间的移植性。
那么c语言的缓冲区在哪里呢
我们对比一下系统调用和c语言的接口就能推断出 write接口是通过fd去文件描述表中寻找对应的文件的缓冲区写入。
fwrite却是向FILE *stream这个流中写入说明FILE*stream这个结构体一定封装了fd和一个缓冲区因为fwrite是write的封装。 #includeunistd.h2 #includesys/stat.h3 #includesys/types.h4 #includefcntl.h5 #includestdio.h6 #includestring.h7 8 int main()9 {10 //使用系统调用接口11 const char *s1 hello write;12 write(1,s1,strlen(s1));13 //使用c语言接口14 const char *s2 hello fwirte;15 fwrite(s2,strlen(s2),1,stdout);16 const char *s3 hello printf; 17 printf(%s,s3);18 19 fork();20 return 0;21 }运行结果 我们发现系统的接口打印了一次而c语言接口打印了两次。
因为向显示器打印刷新策略默认是行刷新只有在遇到\n时才会将c语言缓冲区内容刷新到显示器文件的缓冲区。 但是因为字符串都没有换行所以hello fwrite和hello printf都是在c语言的缓冲区之内fork创建子进程接着进程要退出了要把c语言缓冲区的内容全部刷新到文件的缓冲区因为创建进程后使用数据会发生写时拷贝这样父进程缓冲区有一份hello fwrite和hello printf子进程有一份hello fwrite和hello printf所以c语言接口会被打印两次。
系统接口直接刷新到文件缓冲区自然没有以上问题。
我们只要在每个字符串后面加上个\n就会每个都输出一次因为行刷新遇见\n就会刷新到文件缓冲区最后fork(的时候c语言的缓冲区是空的不会发生写时拷贝自然不会打印两次。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921696.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!