LINUX系统编程:缓冲区

1.为什么要有缓冲区

缓冲区分成语言层面的缓冲区操作系统层面的缓冲区

先说结论,语言的缓冲区可以减少系统调用的次数进而提高向文件写入和读取的效率。

2.举例子

向屏幕打印,无非就是向屏幕这个文件的缓冲区写入,然后在由操作系统刷新到显示器文件,这样显示器就可以显示内容了

#include<unistd.h>2 #include<sys/stat.h>3 #include<sys/types.h>4 #include<fcntl.h>5 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的封装。

 #include<unistd.h>2 #include<sys/stat.h>3 #include<sys/types.h>4 #include<fcntl.h>5 #include<stdio.h>6 #include<string.h>7 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/816180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js学习总结

这里写目录标题 前情提要JavaScript书写位置1. 内部javaScript (不常用)2. 外部javaScript (常用)3.内联javaScript (常用) js中的输入和输出输出语法1. document.write()2. alert()3. console.log() 输入语法prompt() 前情提要 1. 在javaScript中的 分号 是可以省略的JavaScr…

车机系统与 Android 的关系概述

前言&#xff1a;搞懂 Android 系统和汽车到底有什么关系。 文章目录 一、基本概念1、Android Auto1&#xff09;是什么2&#xff09;功能 2、Google Assistant3、Android Automotive1、Android Auto 和 Android Automotive 的区别 4、App1&#xff09;App 的开发2&#xff09;…

亚马逊云科技CTO带你学习云计算降本增效秘诀

2023亚马逊云科技一年一度的重磅春晚--Re:invent上有诸多不同话题的主题Keynote&#xff0c;这次小李哥带大家复盘来自亚马逊CTO: Wener博士的主题演讲: 云架构节俭之道1️⃣节俭对于云计算为什么重要&#xff1f; ▶️企业基础设施投入大&#xff0c;利用好降本策略可以减少巨…

个人笔记目录

目录 一、lora 微调 alpaca 笔记 二、全量微调 Llama2-7b笔记 三、Huggingface trainer 与 from_pretrained简单介绍&#xff08;笔记&#xff09; 四、vscode调试launch.json常用格式 五、huggingface generate函数简介 六、Trl: llama2-7b-hf使用QLora 4bit量化后ds zer…

Java项目-源码!大学生兼职信息系统

大学生兼职信息系统 1、功能介绍1.1、演示视频 2、系统部分功能展示2.1、管理员登录2.2、管理员功能模块2.2.1、轮播图管理2.2.2、招聘信息管理2.2.3、企业信息管理 3、系统概述4、开发环境 1、功能介绍 本文以Java为开发技术&#xff0c;实现了一个大学生兼职信息系统。 功能…

RestTemplate详解

一、概述 文章参考Spring之RestTemplate详解 1.1介绍 现如今的 IT 项目&#xff0c;由服务端向外发起网络请求的场景&#xff0c;基本上处处可见&#xff01; 传统情况下&#xff0c;在服务端代码里访问 http 服务时&#xff0c;一般会使用 JDK 的 HttpURLConnection 或者 A…

【Linux】匿名管道实现简单进程池

一、匿名管道通信的四种情况和五种特性 1.1、四种情况 管道内部没有数据且子进程不关闭自己的写端文件fd&#xff0c;读端&#xff08;父进程&#xff09;就要阻塞等待&#xff0c;直到管道里有数据。管道内部被写满了且父进程&#xff08;读端&#xff09;不关闭自己的读端fd…

kali工具----网络映射器(Network Mapper)系统指纹

系统指纹识别 现在一些便携式计算机操作系统使用指纹识别来验证密码进行登录。指纹识别是识别系统的一个典型模式&#xff0c;包括指纹图像获取、处理、特征提取和对等模块。如果要做渗透测试&#xff0c;需要了解要渗透测试的操作系统的类型才可以。本节将介绍使用Nmap工具测试…

【OTA】STM32-OTA升级——持续更新

【OTA】STM32-OTA升级——持续更新 文章目录 前言一、ymodem串口协议1、Ymodem 协议2、PC3、蓝牙4、WIFI云平台 二、UDS车载协议1.UDS协议 总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、ymodem串口协议 1、Ymodem 协议 STM32 Ymodem …

【第三十篇】并发插件 turbo intruder 安装及使用教程

文章目录 安装使用本篇主要介绍turbo intruder的两种安装方式及使用教程。 安装 1、在BurpSuite的扩展模块的BAPP商店中找到turbo intruder,点击安装即可使用: 2、若在BurpSuite中无法直接安装,可手动添加该插件。 具体操作: 进入Github中安装: https://github.com/Po…

代码随想录算法训练营三刷day53 | 动态规划之子序列 1143.最长公共子序列 1035.不相交的线 53. 最大子序和

day53 1143.最长公共子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 1035.不相交的线53. 最大子序和1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如…

伺服系统中对于前馈算法的一点理解

前馈是指根据指令的偏差控制&#xff0c;当一个系统处在跟随误差较大的运动阶段时&#xff08;运行速度较快&#xff09;&#xff0c;可以加入前馈环节&#xff0c;有助于提高响应速度和改善轨迹控制中的拐角处的工艺特性。 前馈控制主要应用于该控制系统本身存在较大的滞后作用…

全量知识系统 程序详细设计之 统一资产模型(QA百度文库 )

Q1. 在设计的全知系统中&#xff0c;矩阵表示的是“活物”&#xff0c;分别 类似 一个基因的活性、一个实体的辨识度和某种特征的可区分度。 函数的可微、可积和可导性 则表示 运动的控制方式 在您所设计的全知系统中&#xff0c;将矩阵与“活物”的属性&#xff08;如基因的活…

FireProx:一款功能强大的AWS API网关管理与IP地址轮换代理工具

关于FireProx FireProx是一款功能强大的AWS API网关安全管理工具&#xff0c;该工具可以帮助广大研究人员创建实现唯一IP地址轮换的实时HTTP转发代理。 在发送网络请求或进行网络交互时&#xff0c;实现源IP地址轮换是一个非常复杂的过程&#xff0c;虽然社区中也有相关的工具…

【STL详解 —— stack和queue的介绍及使用】

STL详解 —— stack和queue的介绍及使用 stackstack的定义方式stack的使用 queuequeue的定义方式queue的使用 stack stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其只能从容器的一端进行元素的插入与提取操作。 stack的定义方式 首…

前端三剑客 —— JavaScript (第六节)

目录 内容回顾 BOM编程 DOM编程* document对象 document对象的属性 document对象的方法 DOM对象节点 操作DOM对象内容 操作DOM对象的属性 --- DOM对象.属性名称 --- DOM对象[属性名称] --- 调用系统API &#xff08;Application Program interface&#xff09;&#…

Linux登录访问限制

Linux系统下&#xff0c;用户密码的有效期可以通过编辑/etc/login.defs文件控制&#xff1b;密码复杂度规则设定需要通过/etc/pam.d/system-auth文件控制&#xff1b;登录失败次数限制通常由/etc/pam.d/login文件限制&#xff0c;可使用pam_tally2模块进行设置。 Linux系统下的…

代码随想录-算法训练营day09【字符串02:KMP、重复的子字符串、字符串总结、双指针回顾】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第四章 字符串part02 今日任务 ●28. 实现 strStr() ●459.重复的子字符串 ●字符串总结 ●双指针回顾 详细布置 28. 实现 strStr() &#xff08;本题可以跳过&#xff09;因为KMP算法很难&#xff0c;大家别奢求 一…

爬虫 | 网易新闻热点数据的获取与保存

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目是一个简单的网络爬虫&#xff0c;用于从网易新闻的热点新闻列表中提取标题和对应的链接&#xff0c;并将提取到的数据保存到一个 CSV 文件中。 目录 一、技术栈 二、功能说明 三、注意事项 四、代码解析 1. 导入所需…

Playwright安装和基本使用(ui/web自动化)

1.简介 Playwright是2021年微软开源的一个项目「playwright-python」。针对 Python 语言的纯自动化工具&#xff0c;它可以通过单个API自动执行 Chromium&#xff0c;Firefox 和 WebKit 浏览器&#xff0c;同时支持以无头模式、有头模式运行。 Playwright&#xff08;Git&…