前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【Linux】解析 [用户/文件(内核)缓冲区 ],总结画图演示【系统调用与库函数的根本区别】

【Linux】解析 [用户/文件(内核)缓冲区 ],总结画图演示【系统调用与库函数的根本区别】

作者头像
YY的秘密代码小屋
发布2024-10-14 08:39:46
发布2024-10-14 08:39:46
14700
代码可运行
举报
文章被收录于专栏:C++系列C++系列
运行总次数:0
代码可运行

一.C语言缓冲区的机制与策略(无缓冲,行缓冲,全缓冲)

1.缓冲区机制:

  1. 无缓冲(立即刷新)
  2. 行缓冲 (行刷新)
  3. 全缓冲 (缓冲区满了,再刷新)

例子:

  1. 一般对于显示器文件,进行行缓冲(行刷新)
  2. 对于磁盘上的文件,进行全缓冲 (缓冲区满了,再刷新)

2.缓冲区策略:

  1. 一般策略:强制刷新
  2. 特殊情况: 进程退出 的时候,一般要进行刷新缓冲区,即上述强制刷新

二.重新理解【用户/文件(内核)缓冲区 】【刷新】【数据的读写本质】

1.用户缓冲区方面:

  • 刷新: 把数据从C语言缓冲区写入操作系统
  • 我们日常中使用最多的,就是C/C++提供的语言级别的缓冲区
  • 而像一些系统调用,例如write()就没有使用C语言的缓冲区

2.文件缓冲区方面:

  • 而文件缓冲区,属于操作系统层面,存在于FILE结构体中;
  • 无论读写都要把数据加载到文件缓冲区中

3.内核缓冲区方面

  • 文件系统的缓冲区属于内核缓冲区的一种
  • 我们在应用层进行数据的读写本质 是将内核缓冲区中的数据进行来回的拷贝

三.总结画图演示【系统调用与库函数区别】:

  1. 系统调用直接到文件缓冲区一步到位
  2. 库函数还要经过用户缓冲区

四.样例模型演示

1.现象演示——引出原理

  • 我们打印一段代码
代码语言:javascript
代码运行次数:0
复制
#include <stdio.h>
#include <string.h>
int main()
{
   const char *msg0="hello printf\n";
   const char *msg1="hello fwrite\n";
   const char *msg2="hello write\n";
   printf("%s", msg0);
   fwrite(msg1, strlen(msg0), 1, stdout);
   write(1, msg2, strlen(msg2));
   fork();
   return 0;
 }
  • 输出结果
代码语言:javascript
代码运行次数:0
复制
hello printf
hello fwrite
hello write
  • 我们接着进程实现输出重定向操作
  • ./hello > file , 我们发现结果如下
  • 第二次输出中, 只二次输出了printf和fwrite,并没有二次输出write
代码语言:javascript
代码运行次数:0
复制
hello write
hello printf
hello fwrite
hello printf
hello fwrite
  • 原因:printf和fwrite是库函数,write是系统调用
  • 原理机制且看下面分析:

2.原理分析

  1. 我们发现 printf 和 fwrite (库函数)都输出了2次,而 write 只输出了一次(系统调用)。为什么呢?肯定和 fork有关!
  2. 一般C库函数写入文件时是 全缓冲 (缓冲区满了,再刷新) 的,而写入显示器文件是 行缓冲 (行刷新)
  3. printf fwrite 库函数会自带缓冲区,当发生重定向到普通文件时,数据的缓冲方式由行缓冲变成了全缓冲。而我们放在缓冲区中的数据, 就不会被立即刷新 ,甚至是fork之后。但是进程退出之后,会统一刷新,写入文件当中。
  4. write 只打印一次。没有随fork,打印两次, 说明其没有经过C语言库提供的用户缓冲区 而是直接写入到文件中。
  5. 同时,从另一个角度理解。 write的打印不属于进程了,也就不会发生对于用户缓冲区内容的写时拷贝
  6. 我们回顾下面模型,可以看看两者区别
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.C语言缓冲区的机制与策略(无缓冲,行缓冲,全缓冲)
    • 1.缓冲区机制:
    • 2.缓冲区策略:
  • 二.重新理解【用户/文件(内核)缓冲区 】【刷新】【数据的读写本质】
    • 1.用户缓冲区方面:
    • 2.文件缓冲区方面:
    • 3.内核缓冲区方面
  • 三.总结画图演示【系统调用与库函数区别】:
  • 四.样例模型演示
    • 1.现象演示——引出原理
    • 2.原理分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档