文件fd【Linux系统编程】

news2024/11/17 17:43:08

本文是基础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.coloradmin.cn/o/1270499.html

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

相关文章

YOLOv7独家原创改进:自研独家创新FT_Conv,卷积高效结合傅里叶变换

💡💡💡本文自研创新改进:卷积如何有效地和频域结合,引入分数阶傅里叶变换和分数阶Gabor变换,最终创新到YOLOv7。 推荐指数:五星 在道路缺陷检测任务中,原始map为0.8,FT_Conv为0.82 收录YOLOv7原创自研 https://blog.csdn.net/m0_63774211/category_12511937.htm…

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

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

第72讲:MySQL数据库锁机制剖析:行级锁、间隙锁与临键锁详解及应用指南

文章目录 1.行级锁的概念2.行锁的概念以及基本使用2.1.行锁的概念2.2.常见的SQL语句所对应的行锁类别2.3.行锁的基本使用 3.间隙锁和临键锁的概念以及基本使用3.1.间隙锁和临键锁的概念3.2.间隙锁和临键锁的基本使用 1.行级锁的概念 行级锁指的是&#xff0c;每次操作锁住的是…

PyCharm免费安装和新手使用教程

PyCharm是一款由JetBrains公司开发的Python集成开发环境&#xff08;IDE&#xff09;。它提供了一系列强大的功能&#xff0c;包括自动代码完成、语法高亮、自动缩进、代码重构、调试器、测试工具、版本控制工具等&#xff0c;使开发者可以更加高效地开发Python应用程序。 新手…

C++中的类型转换和异常

C类型转换 类型转换(cast) 是将一种数据类型转换成另一种数据类型。例如&#xff0c;如果将一个整型 值赋给一个浮点类型的变量&#xff0c;编译器会暗地里将其转换成浮点类型。 转换是非常有用的&#xff0c;但是它也会带来一些问题&#xff0c;比如在转换指针时&#xff0c…

a-table:表格组件常用功能记录——基础积累2

antdvue是我目前项目的主流&#xff0c;在工作过程中&#xff0c;经常用到table组件。下面就记录一下工作中经常用到的部分知识点。 a-table&#xff1a;表格组件常用功能记录——基础积累2 效果图1.table 点击行触发点击事件1.1 实现单选 点击事件1.2 实现多选 点击事件1.3 实…

高效办公:如何使用视频剪辑工具批量转码,mp4视频到TS视频

在视频处理过程中&#xff0c;转码是一项常见的任务。将MP4视频转换为TS视频可以提供许多优势&#xff0c;包括更好的兼容性、更广泛的设备和平台支持以及更高的视频质量。然而&#xff0c;手动转码大量视频文件可能会非常耗时且效率低下。为了实现高效办公&#xff0c;可以使用…

模板引擎详解

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f324;️动态页面的渲染方式 …

2023-简单点-树莓派-camera module 3介绍

Raspberry Pi Camera Module 3 介绍开头先说&#xff0c;注意事项libcamera感光芯片和驱动的兼容图额外&#xff1a;不同module的对应的参数图用bullseye系统测试摄像头预览窗口拍摄静态图片bayer raw图像获取超长曝光视频流raw视频流 ref 介绍 树莓派镜像在Bullseye版本之后&…

【每日一题】1657. 确定两个字符串是否接近-2023.11.30

题目&#xff1a; 1657. 确定两个字符串是否接近 如果可以使用以下操作从一个字符串得到另一个字符串&#xff0c;则认为两个字符串 接近 &#xff1a; 操作 1&#xff1a;交换任意两个 现有 字符。 例如&#xff0c;abcde -> aecdb操作 2&#xff1a;将一个 现有 字符的…

系统频繁崩溃,如何考虑系统的稳定性和可扩展性?

最近网传互联网应用信息系统频繁崩溃&#xff0c;语雀崩完淘宝崩&#xff0c;淘宝崩完滴滴崩&#xff0c;随着业务的发展和技术的进步&#xff0c;对于信息系统的要求也越来越高。信息应用系统为了满足不断增长的用户和业务需求&#xff0c;提高系统的稳定性和扩展性至关重要。…

华为云cce容器管理中的调度策略作用

研究不深&#xff0c;但是这个还是挺重要的&#xff0c;在这里记录一下。 在cce节点集群中&#xff0c;有时候会发现有的节点实例过于饱满&#xff0c;有的又有些空&#xff0c;导致部分节点由于压力过大&#xff0c;存在崩溃的危险&#xff0c;这时候调度策略就有用了。 我这…

new Date()国际化时间参数处理的存在偏差问题

[TOC](new Date()国际化时间参数处理的存在偏差问题) 实际存在场景&#xff1a;各国使用new Date进行处理时间到各国时区时处理后的日期与实际当地日期不符合&#xff0c;会存在以下场景如图&#xff1a; 统计日期和表头计算的日期不符合 点击某一天跳转到详情时间参数不正确 …

基于谷歌Flutter的媒体资讯APP的设计与实现

基于谷歌Flutter框架媒体资讯App的设计与实现 摘要&#xff1a; 当今社会&#xff0c;随着经济和科技的发展&#xff0c;人们的生活节奏也愈来愈快&#xff0c;人们生活的阅读时间也越来越少&#xff0c;越发的流行碎片化阅读&#xff0c;而同样的对于互联网的客户端开发者&am…

2.Ansible的copy模块,我最常用的模块

1. 简述 先从我自身的情况来说&#xff0c;我不是运维人员&#xff0c;并且对linux操作也不是特别熟悉&#xff0c;所以工作中我使用ansible基本就是在平常的自动化部署中&#xff0c;而使用最多的模块就是copy模块。我使用copy模块也主要是来替换生产环境的配置文件。所以&am…

数据结构树与二叉树(5)Huffman树

#include <iostream> #include <stack> #include <queue>using namespace std;struct Node {char name ;int code[200];int num 0;//code的下标int weight 0;//权重&#xff08;次数&#xff09;Node* lchild;//左孩子Node* rchild;//右孩子Node* parent;N…

获取Spring容器Bean工具类

获取Spring容器Bean工具类 1、创建SpringUtils工具类2、注册 SpringUtils工具类3、如果打包的是War方式&#xff0c;可能上面两个注册工具类的方法都没用 1、创建SpringUtils工具类 public class SpringUtils implements ApplicationContextAware {private static Application…

基于卷积神经网络的人体行为识别系统开发与设计

摘 要 基于卷积神经网络的人体行为识别的开发与设计 摘要&#xff1a;随着计算机领域不断的创新、其它行业对计算机的应用需求的提高以及社会对解放劳动力的迫切&#xff0c;人机交互成为人们关注的问题。深度学习的出现帮助了人们实现人机交互&#xff0c;而卷积神经网络是其…

Codeforces Round 907 (Div. 2) (C 贪心 D套路? F dfs序+差分树状数组)

A&#xff1a; 这种操作题&#xff0c;每次先想这个操作有什么性质 对于2^0来说可以操作 第1位 对于2^1来说可以操作 第1-2位 对于2^2来说可以操作 第1-4位 &#xff08;第3位无法单独修改&#xff09; 对于2^3来说可以操作 第1-8位&#xff08;第5 6 7位无法单独修改&…

SAP ABAP ALV Tree 的使用

在 SAP 业务系统中&#xff0c;大量地使用到了ALV Tree 对象&#xff0c;该对象在表格基础上对同类数据 进行归类&#xff0c;并对各分类能进行数据汇总&#xff0c;如图8-10 所示。 以航班表&#xff08;SPFLI&#xff09;为例&#xff1a; &#xff08;1&#xff09;按国家…