当前位置: 首页 > news >正文

Linux——缓冲区封装系统文件操作

在这里插入图片描述


📘北尘_:个人主页

🌎个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》

☀️走在路上,不忘来时的初心

文章目录

  • 一、FILE
  • 二、封装系统接口实现文件操作
    • 1、text.c
    • 2、mystdio.c
    • 3、mystdio.h



一、FILE

因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访
问的。
所以C库当中的FILE结构体内部,必定封装了fd。
来段代码在研究一下

#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;}

运行出结果:

hello printf
hello fwrite
hello write

但如果对进程实现输出重定向呢? ./hello > file , 我们发现结果变成了:

hello write
hello printf
hello fwrite
hello printf
hello fwrite

我们发现 printf 和 fwrite (库函数)都输出了2次,而 write 只输出了一次(系统调用)。为什么呢?肯定和
fork有关!

一般C库函数写入文件时是全缓冲的,而写入显示器是行缓冲。
printf fwrite 库函数会自带缓冲区(进度条例子就可以说明),当发生重定向到普通文件时,数据的缓冲方式由行缓冲变成了全缓冲。
而我们放在缓冲区中的数据,就不会被立即刷新,甚至fork之后,但是进程退出之后,会统一刷新,写入文件当中。
但是fork的时候,父子数据会发生写时拷贝,所以当你父进程准备刷新的时候,子进程也就有了同样的一份数据,随即产生两份数据。
write 没有变化,说明没有所谓的缓冲。
综上: printf fwrite 库函数会自带缓冲区,而 write 系统调用没有带缓冲区。另外,我们这里所说的缓冲区,
都是用户级缓冲区。其实为了提升整机性能,OS也会提供相关内核级缓冲区。

缓冲区存在于FILE结构体内


二、封装系统接口实现文件操作

1、text.c

在这里插入图片描述

2、mystdio.c

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、mystdio.h

在这里插入图片描述


相关文章:

  • 3.WEB渗透测试-前置基础知识-快速搭建渗透环境(上)
  • 手写commonJS里面的require函数
  • 基于相位的运动放大:如何检测和放大难以察觉的运动(01/2)
  • 【Java EE初阶二十一】http的简单理解(二)
  • 数据结构 计算结构体大小
  • Spring Boot 手写starter!!!
  • 第二章、FFmpeg增加RTP协议外部扩展信息解析
  • 蓝桥杯嵌入式第12届真题(完成) STM32G431
  • 内核内存回收关键隐藏变量之page引用计数
  • unity学习(38)——创建(create)角色脚本(panel)--EventSystem
  • 前端不传被删记录的id怎么删除记录,或子表如何删除记录
  • 【深度学习目标检测】十九、基于深度学习的芒果计数分割系统-含数据集、GUI和源码(python,yolov8)
  • 【C语言】详解计算机二级c语言程序题
  • uni-app 经验分享,从入门到离职(四)——页面栈以及页面跳转的 API(开发经验总结)
  • R语言入门笔记2.5
  • (三)从jvm层面了解线程的启动和停止
  • [译] 怎样写一个基础的编译器
  • 【node学习】协程
  • Bytom交易说明(账户管理模式)
  • django开发-定时任务的使用
  • flutter的key在widget list的作用以及必要性
  • Python socket服务器端、客户端传送信息
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • SQLServer插入数据
  • Vue组件定义
  • 读懂package.json -- 依赖管理
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​queue --- 一个同步的队列类​
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #pragma pack(1)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (windows2012共享文件夹和防火墙设置
  • (论文阅读30/100)Convolutional Pose Machines
  • (七)c52学习之旅-中断
  • (转)socket Aio demo
  • (转载)Linux网络编程入门
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .apk文件,IIS不支持下载解决
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • ;号自动换行
  • @Async注解的坑,小心
  • @DataRedisTest测试redis从未如此丝滑
  • @EnableWebMvc介绍和使用详细demo
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)