缓冲区与C库函数的实现

目录

一、缓冲区

二、C库函数的实现


一、缓冲区

缓冲区本质就是一块内存,而缓冲区存在的意义本质是提高使用者(用户)的效率【把缓冲区理解成寄送包裹的菜鸟驿站】

缓冲区的刷新策略

1. 无缓冲(立即刷新)

2. 行缓冲(行刷新)

3. 全缓冲(缓冲区满了,再刷新) ---》 进程退出属于全刷新的一种

4. 特殊清空:用户强制刷新

显示器文件一般采用行刷新,磁盘上的文件一般采用全刷新

现象:

如何理解上述现象呢???

1.首先,显示器文件刷新方式是行刷新,且fork之前所有的代码都带\n, 所以fork之前,所有代码都被刷新了!而重定向到log.txt, 本质是访问了磁盘文件,刷新方式从行缓冲变成了全缓冲!这意味着缓冲区变大,实际写入的数据不足以把缓冲区写满,fork执行时,数据依然在缓冲区中!

2. 而我们发现,无论如何, 系统调用只打印了一次,而加了fork之后,重定向到文件中的函数打印了两次,因为这些函数底层封装的是write系统调用,这就说明目前我们所说的缓冲区和操作系统没有关系, 只能和C语言有关系! 我们日常用的最多的缓冲区就是C语言提供的缓冲区!

3.C/C++提供的缓冲区,里面保存的是用户的数据,属于当前进程的运行时自己的数据;而如果通过系统调用把数据写入到了OS内部,那么数据就不属于用户了!

4.当进程退出时,要刷新缓冲区,刷新缓冲区也属于写入操作,而fork创建子进程后,父子进程任何一方要对数据写入时,都要发生写时拷贝,所以数据出现两份!而系统调用只有一份,是因为系统调用是在库之下的,不适用C语言提供的缓冲区,直接将数据写入了OS, 不属于进程了,所以不发生写时拷贝,数据只有1份!

上述C语言提供的缓冲区位于FILE结构体内部!!!

二、C库函数的实现

#include "mystdio.h"
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#define DEL_MODE 0666

myFILE* my_fopen(const char *path, const char *mode)
{
    int fd = 0;
    int flag = 0;
    if(strcmp(mode, "r") == 0)
    {
        flag |= O_RDONLY;
    } 
    else if(strcmp(mode, "w") == 0)
    {
        flag |= (O_CREAT | O_WRONLY | O_TRUNC);
    }
    else if(strcmp(mode, "a") == 0)
    {
        flag |= (O_CREAT | O_WRONLY | O_APPEND);
    }
    else
    {
        //do nothing
    }
    if(flag & O_CREAT)
    {
        fd = open(path, flag, DEL_MODE);
    }
    else
    {
        fd = open(path, flag);
    }
    if(fd < 0) 
    {
        errno = 2;
        return NULL;
    }
    myFILE* fp = (myFILE*)malloc(sizeof(myFILE));
    if(!fp) 
    {
        errno = 3;
        return NULL;
    }
    fp->flag = FLUSH_LINE;
    fp->end = 0;
    fp->fileno = fd;
    return fp;
}

int my_fwrite(const char* s, int num, myFILE* stream)
{
    memcpy(stream->buffer+stream->end, s, num);
    stream->end += num;
    //判断是否需要刷新
    if((stream->flag & FLUSH_LINE) && stream->end > 0 && stream->buffer[stream->end-1] == '\n')
    {
        my_fflush(stream);
    }
    return num;
}

int my_fflush(myFILE* stream)
{
    if(stream->end > 0)
    {
        write(stream->fileno, stream->buffer, stream->end);
        //fsync(stream->fileno); //把数据刷新到内核中
        stream->end = 0;
    }
    return 0;
}

int my_fclose(myFILE* stream)
{
    my_fflush(stream);
    return close(stream->fileno);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/454966.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

春风吹又生的开源项目「GitHub 热点速览」

随着上周知名 Switch 开源模拟器 Yuzu&#xff08;柚子&#xff09;被任天堂起诉&#xff0c;该项目作者就删库了&#xff0c;但还是要赔偿任天堂数百万美元。此事还在 GitHub 上掀起了一波 Yuzu fork 项目的小浪潮&#xff0c;正所谓野火烧不尽&#xff0c;春风吹又生。 很多读…

Express学习(四)

使用Express写接口 创建基本的服务器 创建API路由模块 编写GET接口 编写POST接口 CORS跨域资源共享 什么是CORS CORS由一系列HTTP响应头组成&#xff0c;这些HTTP响应头决定浏览器是否阻止前端JS代码跨域获取资源。浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如…

十五、软考-系统架构设计师笔记-面向服务架构设计理论与实践

1、SOA相关概念 面向服务的架构(SOA)的定义 SOA 是一个组件模型&#xff0c;它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的&#xff0c;它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构…

狂揽Github—start19.7k☆开源OCR—Umi-OCR

文章目录 背景Umi-OCR—源码下载Umi-OCR—可执行程序下载页面介绍截图OCR识别批量OCR识别批量文档二维码全局设置 总结&#xff1a; 背景 大家都知道我是一个Python办公自动化的小小程序员&#xff0c;经常收集一些免费开源的OCR供大家使用&#xff0c;目前我已经写出来多家OCR…

(done) win11 如何安装 Anaconda3 ? 如何安装 jupyter notebook

首先是这个网站 https://www.anaconda.com/download/#windows 下载并安装 anaconda3 进入 anaconda3.navigator 后&#xff0c;会看到如下界面 点击下面这个 Launch 按钮&#xff0c;可以启动 jupyter notebook 如下图&#xff0c;jupyter 出来了

【数据结构七】堆与PriorityQueue详解

堆 在Java中有一种数据结构基于队列&#xff0c;并保证操作的数据带有优先级&#xff0c;该数据结构应该提供了两个最基本的操作&#xff0c;一个是返回最高优先级对象&#xff0c;一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue)。它的底层使用了堆这种数据结…

离散化算法,以Acwing802.区间和为例子(C++实现)

目录 1.例题2.算法实现思路3.代码 1.例题 假定有一个无限长的数轴&#xff0c;数轴上每个坐标上的数都是 0现在&#xff0c;我们首先进行 n 次操作&#xff0c;每次操作将某一位置 x 上的数加 c接下来&#xff0c;进行 m 次询问&#xff0c;每个询问包含两个整数 l 和 r&#…

贪心算法(算法竞赛、蓝桥杯)--奶牛晒衣服

1、B站视频链接&#xff1a;A28 贪心算法 P1843 奶牛晒衣服_哔哩哔哩_bilibili 题目链接&#xff1a;奶牛晒衣服 - 洛谷 #include <bits/stdc.h> using namespace std; priority_queue<int> q;//用大根堆维护湿度的最大值 int n,a,b; int tim,maxn;int main(){s…

sqllab第十关通关笔记

知识点&#xff1a; 时间盲注适用于回显无变化的场景重点还是不断的构造payload进行尝试&#xff1b;判断绕过条件 这里就不演示判断注入类型&#xff1b;通过测试发现和第九关一样&#xff1b;回显无变化的&#xff1b; 构造第九关的payload:id1 and if(1,sleep(2),1) -- 发…

MySQL的事务隔离是如何实现的?

目录 从一个例子说起 快照读和当前读 事务的启动时机和读视图生成的时刻 MVCC 隐藏字段 Undo Log回滚日志 Read View - 读视图 可重复读(RC)隔离级别下的MVCC 读提交(RR)隔离级别下的MCC 关于MVCC的一些疑问 1.为什么需要 MVCC &#xff1f;如果没有 MVCC 会怎样&am…

Windows-WSL2-VSCode+Docker配置C++开发环境

Windows-WSL2-VSCodeDocker配置C开发环境 写在前面 因为在学习工作中&#xff0c;需要不同的编码环境&#xff0c;若将这些不同的开发环境都状态一台设备上&#xff0c;很容易出问题&#xff0c;而且迁移性差&#xff0c;于是计划把不同的开发环境用docker隔离开来&#xff0…

Llama-3公布基础训练设施,使用49000个H100

3月13日&#xff0c;社交、科技巨头Meta在官网公布了两个全新的24K H100 GPU集群&#xff08;49,152个&#xff09;&#xff0c;专门用于训练大模型Llama-3。 此外&#xff0c;Llama-3使用了RoCEv2网络&#xff0c;基于Tectonic/Hammerspace的NFS/FUSE网络存储&#xff0c;继续…

嵌入式开发--基于STM32G431RBTx-按键中断

嵌入式开发–STM32G431RBTx-按键 将如下引脚口都设置为输出上拉模式 PB0&#xff0c;PB1&#xff0c;PB2&#xff0c;PA0 设置为上拉模式 配置定时器 如图有反映stm32g431的定时器资源。 时钟源选择外部时钟 设定系数 第一个是分频系数(Prescaler) 第二个是周期计数值&…

F.岛屿个数【蓝桥杯】/dfs+环

岛屿个数 小蓝得到了一副大小为 M N 的格子地图&#xff0c;可以将其视作一个只包含字符‘0’&#xff08;代表海水&#xff09;和 ‘1’&#xff08;代表陆地&#xff09;的二维数组&#xff0c;地图之外可以视作全部是海水&#xff0c;每个岛屿由在上/下/左/右四个方向上相…

记一次生产慢sql索引优化及思考

记一次生产慢sql索引优化及思考 问题重现 夜黑风高的某一晚&#xff0c;突然收到一条运营后台数据库慢sql的报警&#xff0c;耗时竟然达到了60s。看了一下&#xff0c;还好不是很频繁&#xff0c;内心会更加从容排查问题&#xff0c;应该是特定条件下没有走到索引导致&#x…

Jmeter---逻辑控制器

if 控制器 1. 先添加一个 用户自定义的变量&#xff0c;并填写变量名和值 2.再添加一个if控制器&#xff0c;并填写判断内容 【语法&#xff1a;""""】 forEach控制器 1. 先添加一个用户自定义变量 2. 再添加一个forEach控制器 循环控制器 1. 添加循环…

【2024-03-12】设计模式之模板模式的理解

实际应用场景&#xff1a;制作月饼 过程描述&#xff1a; 一开始&#xff0c;由人工制作月饼&#xff0c; 第一个&#xff1a;根据脑子里面月饼的形状&#xff0c;先涅出月饼的形状&#xff0c;然后放入面粉和馅料把开口合并起来。 第二个&#xff1a;根据脑子里面月饼的形状&…

ASP.NET排课实验室排课,生成班级课表实验室课表教师课表(vb.net)-214-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword214 要看成品演示 请联系客服发给您成品演示 课题&#xff1a;实验课排课系统 计算机 上机课 一周上5天课&#xff0c;周一到周五 一周上5天课&#xff0c;周一到周五 因为我排的是实验课&#xff0c;最好1&#xf…

【Paper Reading】6.RLHF-V 提出用RLHF的1.4k的数据微调显著降低MLLM的虚幻问题

分类 内容 论文题目 RLHF-V: Towards Trustworthy MLLMs via Behavior Alignment from Fine-grained Correctional Human Feedback 作者 作者团队&#xff1a;由来自清华大学和新加坡国立大学的研究者组成&#xff0c;包括Tianyu Yu, Yuan Yao, Haoye Zhang, Taiwen He, Y…

HTML静态网页成品作业(HTML+CSS)——家乡广州介绍设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…