波奇学Linux:文件缓冲区

news2024/11/29 12:55:38

问题导入

文件流输出直接向显示器和重定向文件有不一样的表现

分别向显示器文件输出四个语句,最后fork创建子进程。

当程序运行时和程序重定向到文件中,输出的内容不一样。

重定向时c库函数(printf,fprintf,fwrite)调用了两次,而系统调用write函数只调用了一次

关闭对应的虚拟文件,只有系统调用可以输出

屏蔽系统调用,同时关闭显示器对应的虚拟文件

运行程序没有任何输出,只有系统调用有输出。如果先close(1)再系统调用也没有任何输出。

解释问题

问题二的解释

调用c的库函数是存在一个用户级别的缓冲区,当缓冲区的数据刷新时会把数据刷新到内核级别的缓冲区,而write函数可以直接把数据输入内核级别的缓冲区,而close的作用关闭fd为1虚拟文件。

相当于fprintf/printf和fwrite刷新不到内核级别的缓冲区了,而write可以直接写入。所以只有write的输出有结果。

那么就是说,只要把数据刷新到内核级别的缓冲区就能输入到显示器中。

目前我们认为,只要将数据刷新到内核,数据就可以刷新到硬件

用户级别缓冲区的刷新策略

无缓冲---直接刷新

行缓冲---缓冲区不刷新,直到碰到\n ---显示器

全缓冲---缓冲区写满才刷新---普通文件写入

进程退出也会刷新

显示器的文件的刷新方案是行刷新,所以printf执行完就立即遇到\n

因此我们只要加上\n让缓冲区立刻刷新,保证在close代码前就把数据刷新进入内核中,就能把信息输出到屏幕上。

所以在原代码中,库函数调用的语句都在缓冲区,没有立刻刷新,当进程退出时刷新缓冲区时,已经运行了close语句,此时缓冲区已经没办法找到内核了。

刷新的本质就是将数据通过fd=1+write接口写入到内核中.

有了以上铺垫我们就可以解释为什么库函数调用exit会刷新缓冲区,系统调用_exit不会刷新缓冲区

对于exit而言,他是包含用户级别的缓冲区而内核的,而_exit只知道内核,无法接触上一级的缓冲区也就无法刷新。

解释问题一

重定向意味着文件流是输入到普通文件,而不是显示器,是全缓冲策略。\n不会再刷新缓冲区,而是进程结束时刷新缓冲区。

而进程前运行fork函数,对数据进行写时拷贝。产生两个缓冲区。

注意write的输入不经过这个缓冲区,所以不会重复。

以fprintf举例。

缓冲区存在意义

体现封装的特性,对于库函数来说,不需要关注数据是如何刷新到硬件上的,只用把数据刷新到缓冲区即可

配合格式化,如将int型等都转换为字符串

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

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

相关文章

片上网络NoC(3)——拓扑指标

目录 一、概述 二、指标 2.1 与网络流量无关的指标 2.1.1 度(degree) 2.1.2 对分带宽(bisection bandwidth) 2.1.3 网络直径(diameter) 2.2 与网络流量相关的指标 2.2.1 跳数(hop coun…

JAVA设计模式之中介者模式详解

中介者模式 1 中介者模式介绍 提到中介模式,有一个比较经典的例子就是航空管制。 为了让飞机在飞行的时候互不干扰,每架飞机都需要知道其他飞机每时每刻的位置,这就需要时刻跟其他飞机通信。飞机通信形成的通信网络就会无比复杂。这个时候&…

【王道数据结构】【chapter5树与二叉树】【P158t6】

二叉树按二叉链表形式存储&#xff0c;试编写一个判别二叉树是否是完全二叉树的算法 #include <iostream> #include <queue> typedef struct treenode{char data;struct treenode *left;struct treenode *right; }treenode,*ptreenode;ptreenode buytreenode(char …

3dmax云渲染怎么使用?渲染100邀请码1a12

本文为大家整理了3dmax云渲染的使用教程&#xff0c;一起来看看吧。案例&#xff1a;渲染效果图&#xff0c;插件方式提交必备工具&#xff1a;渲染100客户端 1、进入渲染100官网(http://www.xuanran100.com/?ycode1a12)注册账号&#xff0c;记得注册时填邀请码1a12&#xff0…

UnityShader——03图形硬件简史与可编程管线

图形硬件简史与可编程管线 GPU发展简史 GPU英文全称Graphic Processing Unit&#xff0c;中文翻译为“图形处理器”&#xff0c;在现代计算机系统中的作用变得越来越重要 20世纪六七十年代&#xff0c;受硬件条件的限制&#xff0c;图形显示器只是计算机输出的一种工具&…

LeetCode、136. 只出现一次的数字【简单,位运算】

文章目录 前言LeetCode、136. 只出现一次的数字【简单&#xff0c;位运算】题目链接与分类思路异或一遍运算 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术…

【蓝桥杯】灭鼠先锋

一.题目描述 二.解题思路 博弈论&#xff1a; 只能转移到必胜态的&#xff0c;均为必败态。 可以转移到必败态的&#xff0c;均为必胜肽。 最优的策略是&#xff0c;下一步一定是必败态。 #include<iostream> #include<map> using namespace std;map<string,bo…

Java之拦截器interceptor

1. 概念 2. 步骤 第一步 第二步 参考资料 https://www.bilibili.com/video/BV1m84y1w7Tb?p168&vd_source705343a89f38d5c0d895383ccf38a5d6

VS Code主题设置(美化VS Code)

主题的具体效果放在了文章末尾&#xff0c;这篇文章后续也会进行更新 目录 切换整体主题&#xff08;整体主题&#xff09; 1.VS Code内置主题&#xff08;快捷键&#xff1a;CtrlK &#xff0c;CtrlT&#xff09; 1.VS Code左上角点击文件 2.选择首选项-->主题-->颜色…

LeetCode、1318. 或运算的最小翻转次数【中等,位运算】

文章目录 前言LeetCode、1318. 或运算的最小翻转次数【中等&#xff0c;位运算】题目链接与分类题解位运算 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领…

Map和Set(哈希表)

目录 map&#xff1a; map说明&#xff1a; Map.Entry的说明&#xff1a;,v> Map 的常用方法: 演示&#xff1a; 注意&#xff1a; TreeMap和HashMap的区别 Set&#xff1a; 常见方法说明&#xff1a; 注意&#xff1a; TreeSet和HashSet的区别 哈希表: 冲突&a…

数模.SI模型SI的四种扩展

一&#xff1a;最简单的考虑方式 二考虑某种使得参数beta降低的因素 三&#xff1a;增加人口自然出生率和死亡率&#xff0c;但不考虑疾病的死亡率 四&#xff1a;不考虑人口自然出生率和死亡率&#xff0c;只考虑疾病的死亡率 五&#xff1a;同时考虑人口自然出生率和死亡率和…

面向对象2:继承

目录 2.1继承 2.2 继承的好处 2.3 权限修饰符 2.4 单继承、Object 2.5 方法重写 2.6 子类中访问成员的特点 2.7 子类中访问构造器的特点 面向对象1&#xff1a;静态 2.1继承 向对象编程之所以能够能够被广大开发者认可&#xff0c;有一个非常重要的原因&#xff0c;是…

AI绘画作品的展示和变现

AI绘画作品的展示和推广技巧 如何通过AI绘画打造独特的个人IP 4.1 AI绘画作品买卖 平台一&#xff1a;抖音 抖音平台有「抖音图文扶持计划」&#xff0c;还会不定期推出图文伙伴计划、图文热点来了等&#xff0c;大家起号的时候更容易 当你的每篇作品阅读量稳定在 1W 时&…

常见单例模式详解

单例模式是23种设计模式中应用最广的模式之一&#xff0c;其定义&#xff1a;确保某一个类只有一个实例&#xff0c;而且自行实实例化并向整个系统通过这个实例。其类图如下&#xff1a; 通俗来说&#xff0c;单例模式就是用于创建那些在软件系统中独一无二的对象。在一个软件系…

ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions

异常处理模型详解之异常处理概述 一&#xff0c;异常处理相关概念二&#xff0c;异常处理概述 一&#xff0c;异常处理相关概念 在介绍异常处理之前&#xff0c;有必要了解一些关于异常处理状态的术语&#xff1a; 当处理器响应一个异常时&#xff0c;我们称该异常被获取了&a…

【C++入门语法】1.变量的世界

​ 欢迎来到C的世界&#xff01;在这篇文章中&#xff0c;我们将一起探索C编程中的基本概念——变量。变量是程序设计中非常重要的一部分&#xff0c;它们是存储数据的容器&#xff0c;让我们的程序能够记住和操作这些信息。 什么是变量&#xff1f; 变量是一个标识符&#x…

Web前端开发

一、概述 1.1 什么是HTML、CSS&#xff1f; 二、HTML 2.1 HTML快速入门 2.2 基础标签和样式 2.2.1 标题 &#xff08;1&#xff09;标题排版 输入&#xff01;加回车&#xff0c;直接生成HTML基本结构标签 。 <!-- 声明当前文档类型 --> <!DOCTYPE html> &l…

windows@命令行映射磁盘驱动器若干方法@开机自动映射网络磁盘

文章目录 windows映射网络磁盘驱动器资源管理器中GUI方式创建命令行方式创建命令行列出驱动器列表删除取消映射持久化配置映射&#x1f47a;记住凭证 FAQ开机自启登录系统后自动挂载&#x1f47a;[以alist webdav 挂载为例]分析对策延迟挂载&#x1f47a;Note 访问已经挂载网络…

【牛客面试必刷TOP101】Day19.BM24 二叉树的中序遍历和BM26 求二叉树的层序遍历

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…