文件fd【Linux系统编程】

本文是基础IO的第一个部分,基础IO部分将主要讲解以下内容:文件fd 文件系统 软硬链接 操作系统的内存管理 以及 动静态库。本节重点讲解文件fd,其余内容将在后面的博客更新。

一、共识

文件 = 内容 + 属性

文件分为打开了的文件和没打开的文件。

打开的文件:谁打开?进程 (本质是研究进程和文件的关系)

没打开的文件:磁盘里,很多,如何存储?------>快速增删查改。

本节重点讨论打开的文件!

文件被打开,必须先加载到内存,且是其属性先加载到内存,一个进程可以打开多个文件。

操作系统内,一定存在着大量被打开的文件,要对他们进行管理:先描述,再组织!

此时对文件的管理,就转换成对链表的增删查改。

目录

一、共识

二、C文件接口

三、过渡到系统,认识文件系统调用

四、访问文件的本质

五、重定向和缓冲区

重定向

缓冲区 


二、C文件接口

FILE *fp = fopen ("log.txt","w");

如果没有指定路径,默认在当前路径创建(当前路径指进程的当前路径,即cwd,如果更改了cwd,就把文件创建到新的路径了)。

child("/home/JY");//更改当前进程的工作路径。

size_t fwrite ( const void *ptr,size_t size,size_t nmemb,FILE * stream );

size:一个基本单位的大小

nmemb:几个基本单位

const char *message = "hello Linux";
fwrite(message,strlen(message),1,fp);

"w" 写入前,会先对文件进程清空。

(echo "hello Linux" > log.txt 输出重定向本质:打开log.txt 文件,清空,再写入)。

"a" 追加,往文件结尾处写。

三、过渡到系统,认识文件系统调用

文件在磁盘上,访问文件,就是访问硬件。用户不能直接访问硬件,必须通过系统调用接口。

打开文件的系统调用接口:

int open ( const char *pathname,int flags,mode_t mode)

pathname:文件路径

mode:文件权限,如果没传,文件的权限可能为乱码,手动传了之后,注意还有umask(更改当前进程的umask:umask(0));

flags:打开文件的方式(比特位级别的传参方式)

        可传:O_RDONLY(只读) O_WRONLY(只写) O_RDWR(读写)

        O_CREAT(创建) O_APPEND(追加)O_TRUNC (清空)等等。

头文件:<sys/types.h> <sys/stat.h> <fcntl.h>

补充:比特位级别的传参

C语言里的fopen函数就是对open系统调用接口的封装!

如:FILE *fp = fopen("log.txt","w");

其内部一定封装了:int fd = open("log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);

以“w”方式打开,如果文件不存在,会自动创建一个,所以要带O_CREAT;打开文件后,会先清空文件内容,所以要带O_TRUNC。

ssize_t write ( int fd,const void * buf,size_t count );

ssize_read ( int fd,void * buf,size_t count );

四、访问文件的本质

open的返回值fd本质就是array数组的下标,FILE是C库自己定义的struct,其中必定也封装了fd。 printf("stdin->fd:%d\n",stdin->fileno);

 补充:系统默认打开3个文件,键盘文件、显示器文件、显示器文件

在C语言里就是stdin,stdout,stderr

关闭文件:struct file里有一个引用计数count,在调用close(1), 会将1号文件的count--;判断count是否为0,在将struct file* 置空,为0就回收该struct file。

五、重定向和缓冲区

文件描述符的分配规则是什么?

从0小标开始,寻找最小的没有使用的数组位置,它的下标就是新文件的文件描述符。

重定向

close(1)之后,1号位置指向空,open log.txt时,从小下标开始找,找到1,就让1指向log.txt,所以后面在向1号文件write时,就是往log.txt里写入了。这就是重定向的原理。

其实不用先关闭再打开,只需要有一个系统接口能将3号指针拷贝给1号指针,就能完成重定向。 

对应的系统调用接口:

追加重定向:把选项O_TRUNC改为O_APPEND

缓冲区 

C缓冲区刷新:

a、无缓冲(直接刷新)        b、行缓冲        c、全缓冲(文件)

先看一个现象,下面程序运行时,为什么没有结果输出到显示器?

每个打开的文件都有一个语言级别的缓冲区,C语言里的printf/fprintf/fwrite等,会先将数据写到C语言提供的缓冲区里(区别于内核级缓冲区),它会在某些时机刷新到内核级的缓冲区。在本例中,fwrite写到了C语言级的缓冲区,然后就将1号显示器文件关闭了,并没有写入内核级的缓冲区,因此,没有成功将数据写入1号显示器文件。 

现象二:上面的代码是能成功打印hello Linux的。

write是系统接口,会直接将数据写入内核级缓冲区,所以即使没有‘\n’,也会显示结果。

现象三:

由显示器重定向到文件时,刷新方案由行缓冲变成了全缓冲,write是直接写到系统缓冲区的,而printf等C接口本来是行缓冲,但变为了全缓冲,就先不刷新了,fork创建子进程后,发生写时拷贝,因此数据多了一份,进程结束后,就刷新了缓冲区。

 用户刷新的本质:将数据通过write写到内核中,平时用的flush一定封装了write。

进程退出时,也会刷新缓冲区,那为什么还需要语言级的缓冲区呢?

1、解决效率问题

2、配合格式化

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

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

相关文章

第二证券:股票几点到几点开盘?

作为股民或许投资者&#xff0c;我们都知道股票是每天都有开盘和收盘时间的。但是&#xff0c;关于股票的开盘时间&#xff0c;很多人并不是很清楚&#xff0c;特别是初学者。在本文中&#xff0c;我们将从多个视点分析股票开盘时间&#xff0c;并为大家供给一些有用的信息。 …

血的教训--kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】

血的教训–kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】 最近下载了一个2023版本的kail系统&#xff0c;但是经过几次设置免密后&#xff0c;ssh过去一直让提供密码&#xff0c;所以就仔细的分析了一下&#xff0c;果然还是发现了点猫腻 接上一个博客&#xff0c;大…

CSS新手入门笔记整理:CSS边框样式

边框宽度&#xff1a;boder-width 语法 boder-width:像素值&#xff1b; 边框样式&#xff1a;boder-style 语法 boder-style:取值&#xff1b; 属性值 说明 none 无样式 dashed 虚线 solid 实线 边框颜色&#xff1a;boder-color 语法 boder-color:色值&#xf…

Mysql之子查询(知识点+例题)

Mysql之子查询<知识点例题> 什么是子查询案例分析案例分析子查询的分类单行子查询子查询中的空值问题题目练习题目一题目二题目三题目四题目五补充&#xff1a;聚合函数与GROUP BY的使用关系 CASE表达式&#xff08;子查询中的运用&#xff09;简单CASE表达式搜索CASE表达…

电脑突然死机怎么办?教你几招快速拯救

当今社会&#xff0c;电脑成为我们日常生活和工作不可或缺的一部分。然而&#xff0c;有时电脑可能会突然死机&#xff0c;给我们的操作和数据带来不便。那电脑突然死机怎么办呢&#xff1f;本文将介绍解决电脑突然死机的三种方法&#xff0c;通过详细的步骤指南&#xff0c;帮…

类 —— 继承、多重继承

继承 一个类&#xff0c;继承另一个已有的类。&#xff08;在一个已存在的类的基础上建立一个新的类&#xff0c;并拥有其特性&#xff09; 是一个父类&#xff08;基类&#xff09;派生出子类&#xff08;派生类&#xff09;的过程。 派生类往往是基类的具象化&#xff0c;基…

接口测试之测试原则、测试用例、测试流程......

一、接口的介绍 软件测试中&#xff0c;常说的接口有两种&#xff1a;图形用户接口&#xff08;GUI&#xff0c;人与程序的接口&#xff09;、应用程序编程接口&#xff08;API&#xff09;。 接口&#xff08;API&#xff09;是系统与系统之间&#xff0c;模块与模块之间或者…

异常数据检测 | Python实现oneclassSVM模型异常数据检测

支持向量机(SVM)的异常检测 SVM通常应用于监督式学习,但OneClassSVM[8]算法可用于将异常检测这样的无监督式学习,它学习一个用于异常检测的决策函数其主要功能将新数据分类为与训练集相似的正常值或不相似的异常值。 OneClassSVM OneClassSVM的思想来源于这篇论文[9],SVM使用…

unity UGUI中获取点击位置处的URL链接

需求是&#xff0c;我们在一个text组件中像写网页那样写入链接&#xff0c;然后点击这个链接&#xff0c;就能访问配置的网页啥的。比如&#xff1a; <a href"hello">链接文本</a></summary> 最终的效果如下&#xff1a; 图中&#xff0c;image区…

华为智能手表独立导航,一呼即应轻松畅行

PetalMaps 手表独立导航&#xff0c;一声令下唤醒导航&#xff0c;打造了智慧的语音交互唤醒体验功能。导航时&#xff0c;语音播报、变道震动提醒功能&#xff0c;让您尽情体验腕上导航乐趣&#xff0c;同时又能安全抵达目的地。

通过滴滴技术博客:探寻造成此次P0故障的真正原因

2023年11月27日晚至2023年11月28日早晨&#xff0c;滴滴发生了长达12小时的P0级故障&#xff0c;导致滴滴核心业务都受到了影响&#xff0c;比如不显示定位无法打车、滴滴单车无法扫码等问题&#xff0c;期间滴滴进行了多次致歉 目前问题故障已经恢复&#xff0c;根据最新的消息…

Python使用pywebview开发桌面应用:打造现代化、跨平台的用户体验

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在当今科技快速发展的时代&#xff0c;为了提供更好的用户体验&#xff0c;许多应用程序都转向了桌面应用的开发。在Python领域&#xff0c;pywebview是一款优秀的库&#xff0c;它使得用Web技术开发桌面应用变得…

flask中路由route根据字典ID展示部分内容,字典名展示全部内容

from flask import Flask, jsonify , request,render_template,app Flask(__name__)app.config[JSON_AS_ASCII] Falsebooks [{"id": 1, "name": 三国演义},{"id": 2, "name": 水浒传},{"id": 3, "name": 西游记…

王道p18 2.设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为 O(1)。(c语言代码实现)

视频讲解在这&#xff08;谢谢各位大佬&#xff09;&#xff1a;&#x1f447; c语言代码实现数据结构课后代码题顺序表p18 2_哔哩哔哩_bilibili 本题代码如下 void nizhi(struct sqlist* s) {int temp 0;for (int i 0; i < s->length / 2; i){temp s->a[i];s-&…

【Springboot系列】SpringBoot整合Jpa

文章目录 前言&#xff1a;什么是JPA&#xff1f;JPA优缺点优点1.简化开发&#xff1a;2.高度抽象&#xff1a;3.跨数据库支持&#xff1a;4.自动化的事务管理&#xff1a; 缺点1.学习成本较高&#xff1a;2.性能问题&#xff1a;3.灵活性受限&#xff1a; 示例版本依赖代码Use…

linux 服务 下 redis 安装和 启动

官网下载 https://redis.io/download/ 安装步骤&#xff1a; 1.安装redis 所需要的依赖 yum install -y gcc tcl2.上传安装包并解压&#xff0c;下载安装包&#xff0c;上传到/usr/local/src目录&#xff0c;解压 tar -zxvf redis-7.2.3.tat.gz进入安装目录&#xff0c;运行…

【SK-learn学习】1.16 概率校准

一、说明 概率校准&#xff0c;指的是对于分类器而言&#xff0c;对应多种类别&#xff0c;概率最大就将样本归入&#xff0c;这个事实没有考虑置信度的问题。sklearn的calibration就是指的这种情形&#xff0c;参考本文。 二、关于sklearn.calibration的概念 执行分类时&#…

Haskell和http-client库下载代码示例

haskell import Network.HTTP.Client 然后&#xff0c;我们需要定义一个函数来下载视频。这个函数将接收一个URL作为参数&#xff0c;并返回一个IO动作&#xff0c;该动作将下载视频文件到当前目录。 haskell downloadVideo :: String -> IO () downloadVideo url do --…

Kubernetes(K8s)资源管理-03

资源管理 资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务&#xff0c;所谓的部署服务&#xff0c;其实就是在kubernetes集…

【同一局域网下】访问其他电脑的虚拟机

一、在被连接的电脑上对VMware进行设置 编辑 --> 虚拟网络编辑器 按顺序点击 如果22端口已被占用&#xff0c;可以自行定义 &#xff08;端口号越大&#xff0c;被占用的可能性越小&#xff09; 二、在被连接的电脑上对防火墙进行设置&#xff08;这里以win11为例&#xff…