Linux系统编程——文件操作原理

news2024/11/19 6:16:56

文件描述符

1.文件描述符是文件的索引:

对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或者创建一个新文件时,内核向进程返回一个文件描述符。

int fd1 = open("./file1",O_RDWR);//打开文件描述符f1对应的文件file1
int fd2 = creat("./file2",S IRWXU);//创建文件描述符fd2对应的文件file2

当读写一个文件时,用open和creat返回的文件描述符标识该文件,将其作为参数传递给read和write。

 n_write = write(fd1,buf,strlen(buf));//将buf中的内容写入文件描述符fd1对应的文件
n_read = read(fd2,readBuf,n_write);//读取文件描述符fd2对应文件的内容

按照惯例,,UNIX shell使用文件描述符0与进程的标准输入(键盘输入)相结合,文件描述符1标准输出(打印键盘输入)相结合,文件描述符2标准错误输出相结合。STDIN.FILENO、STDOUTFILENO、STDERR FILENO这几个宏代替了0、1、2这几个数。代码示例:

int main()
{
        char readBuf[128];

        int n_read = read(0,readBuf,5);//在readBuf中输入5个字节
        int n_write = write(1,readBuf,strlen(readBuf));//讲输入的字节打印出来
        printf("\ndone!\n");

        return 0;
}

2.文件猫还符,这个数字在一个进程中表示一个特定含义,当我们open一个文件时,提作系统在内存中构建了一些数据结构来表示这个动态文件,然后饭回给应用程序一个数字作为文件描述符,这个数字就和我们内存中维护的这个动态文件的这些数据结构绑定上了,以后我们应用程序如果要操作这个动态文件,只需要用这个文件描述符区分即可。

3.文件描述符的作用域就是当前进程,出了这个进程文件描述符就没有意义了。

文件编程步骤

1、在Linux中要操作一个文件,一般是先open打开一个文件,得到文件描述符,然后对文件进行读写操作(或其他操作),最后是close关闭文件即可
2、强调一点:我们对文件进行操作时,一定要先打开文件,打开成功之后才能操作,如果打开失败,就不用进行后边的操作了,最后读写完成后,一定要关闭文件,否则会造成文件损坏

静态文件和动态文件

静态文件存放于磁盘中,而当我们打开静态文件后,会在Linux内核产生一个结构体来记录该静态文件,结构体又包含静态文件的文件描述符、内容和信息节点等,此时Linux内核就会分配内存给动态文件。

1.文件平时是存放在块设备中的文件系统文件中的,我们把这种文件叫静态文件,当我们去oDn打开一个文件时,liux内核做的操作包括:内核在进程中建立一个打开文件的数据结构,记录下我们打开的这个文件;内核在内存中申请一段内存,并且将静态文件的内容从块设备中读取到内核中特定地址管理存放(叫动态文件)。
2.打开文件以后,以后对这个文件的读写操作,都是针对内存中的这一份动态文件的,而并不是针对静态文件的。当然我们对动态文件进行读写以后,此时内存中动态文件和块设备文件中的静态文件就不同步了,当我们cose关闭动态文件时,close内部内核将内存中的动态文件的内容去更新(同步)块设备中的静态文件。

文件存放

文件打开修改

此时cpu对内存里的动态文件进行修改

操作完成

此时close内部内核将内存中的动态文件的内容去更新(同步)块设备中的静态文件

注:为什么不对块设备直接进行操作?

块设备本身读写非常不灵活,是按块读写的,而内存是按字节单位操作的,而且可以随机操作,很灵活。

比如现在磁盘中存放20个字节,但是你只输入5个字节,此时你想对5个字节中的其中一个进行修改,在块设备中是修改不了的,而在内存中可以修改。

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

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

相关文章

【C++初阶】二、入门知识讲解(引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【C初阶】一、入门知识讲解 (C关键字、命名空间、C输入&输出、缺省参数、函数重载)-CSDN博客 六 . 引用 (1). 引用的概念和特性…

内存管理

目录 C/C内存分布 引入 分析 说明 C语言内存管理方式:malloc calloc realloc free malloc realloc calloc 面试题 C内存管理方式 new/delete操作符 用法 new和delete操作自定义类型 operator new和operator delete函数 operator new ​编辑 operator…

什么是Ribbon的饥饿加载?有什么优势?

目录 一、什么是Ribbon 二、什么是饥饿加载 三、Ribbon饥饿加载的优势 四、Ribbon饥饿加载的劣势 一、什么是Ribbon Ribbon是一个开源的、基于HTTP和TCP的客户端负载均衡工具,它提供了一个简单的、基于配置的负载均衡策略,可以帮助开发人员更轻松地…

“护肤品销售策略:从“免费拼团”到“3人回本大放送”“

有一个销售护肤品的团队,他们家399块钱一套的护肤品,他们在小程序这一个渠道,只用了23天的时间,就卖出去了2000多万的营业额,你敢信吗? 那么23天的时间,他们是怎么卖出去2000多万的呢&#xff1…

宠物社区系统宠物领养小程序,宠物救助小程序系统多少钱?

当前很多的宠物被抛弃和虐杀,它们没有选择权,我们强制性的把狗带进人类的生活中,然后又无情的抛弃,让它们无家可归,变成流浪狗,它们做错了什么?流浪动物被主人遗弃之后居无定所,时刻…

基于VSCode + PlatformIO创建运行第一个esp32程序

文章目录 使用VSCode创建项目安装驱动下载驱动安装驱动连接开发板电脑识别开发板 编写程序烧录程序第一步、编译程序第二步、烧录程序第三步、开发板观察效果 原理讲解项目源码 在之前的课程,我们已经介绍了ESP32单片机,并且也已经安装好了开发环境&…

upload-labs12-21关

第十二关 提示及源码 $is_upload false; $msg null; if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],strrpos($_FILES[upload_file][name],".")1);if(in_array($file_ext,$ext_arr)){$temp_file $_FILES…

C语言【趣编程】我们怎样便捷输出空心的金字塔

目录 1问题: 2解题思路: 3代码如下: 4代码运行结果如下图所示: 5总结: r如若后续有不会的问题,可以和我私聊; 1问题: 2解题思路: 方法:找规律&#xff0…

记录--vue3 setup 中国省市区三级联动options最简洁写法,无需任何库

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在写页面的时候,发现表单里面有一个省市区的 options 组件要写,因为表单很多地方都会用到这个地址选择,我便以为很简单嘛。 虽然很简单的一个功能,但是网…

上拉电阻与下拉电阻

文章目录 上拉电阻下拉电阻上下拉电阻作用1、稳定信号2、减少电磁干扰3、提高驱动能力 大家在玩单片机的过程中,一定没少听过上拉电阻和下拉电阻这组名词,那么到底什么是上拉电阻和下拉电阻呢?今天我们一起来简单了解一下 上拉电阻 上拉电阻…

激光雷达标定板是自动驾驶系统中关键部件

中国政府制定了多项产业发展规划,包括《汽车产业中长期发展规划》和《新一代人工智能发展规划》等,旨在推动汽车产业的转型升级,培育具有国际竞争力的汽车品牌,同时鼓励企业加大对自动驾驶技术研发的投入,加快自动驾驶…

目标检测算法改进系列之Backbone替换为VanillaNet

VanillaNet简介 简介:VanillaNet是一种在设计中融入优雅的神经网络架构,通过避免高深度,shortcut和自注意力等复杂操作,VanillaNet简单而强大。每一层都经过精心制作,紧凑而直接,在训练后对非线性激活函数…

医学图像 ABIDE 等数据集 .nii.gz Python格式化显示

nii.gz 文件 .nii.gz 文件通常是医学影像数据的一种常见格式,比如神经影像(如脑部MRI)。这种文件格式通常是经过gzip压缩的NIfTI格式(Neuroimaging Informatics Technology Initiative)。 要在Python中查看.nii.gz文…

初学前端CSS教案(理论+代码+效果图)

文章目录: 一:前言 1.什么是CSS呢? 2.环境 3.HTML5相关 4.瞅瞅CSS代码样式什么样? 二:编码规范 1.声明 2.注释 3.选择器 3.1 块元素选择器{} 3.2 id选择器 " # " 3.3 class选择器 " . &quo…

说说你对React Router的理解?常用的Router组件有哪些?

一、是什么 react-router等前端路由的原理大致相同,可以实现无刷新的条件下切换显示不同的页面 路由的本质就是页面的URL发生改变时,页面的显示结果可以根据URL的变化而变化,但是页面不会刷新 因此,可以通过前端路由可以实现单…

Git 进阶使用

一. Git图形化操作 1.1.什么是图形化管理工具 图形化管理工具是一种通过可视化界面来操作计算机系统或应用程序的软件工具。在软件开发中,它通常用于管理和操作版本控制系统(如Git、SVN等)以及代码开发环境(如IDE)。与…

Leetcode刷题详解——单词搜索

1. 题目链接:79. 单词搜索 2. 题目描述: 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的…

python 对全局变量的修改,需要使用global关键字

is_debug Falsedef get_is_debug():return is_debugdef set_is_debug(dbg):global is_debugis_debug dbg代码review的时候有个同事(我们主要都是开发c代码的,python也会写,但是用的少)说,set_is_debug函数中 is_debu…

自动驾驶算法(十):多项式轨迹与Minimun Snap闭式求解原理及代码讲解

目录 1 多项式轨迹与Minimun Snap闭式求解原理 2 代码解析 1 多项式轨迹与Minimun Snap闭式求解原理 我们上次说的Minimun Snap,其实我们就在求一个二次函数的最优解: 也就是优化函数在约束下的最小值。 但这是一个渐进最优解而不是解析最优解&#xf…

LeetCode16的最接近的三数之和

目录 优化解法暴力搜索 优化解法 看了题解之后的根据题解的意思编写的优化解法,感觉还行,代码算是比较简短了,没有复杂的逻辑,就是写的时候总是只记得记录那个sum,忘记要记录最小的差值,更新min_minus. class Solution {public int threeSumClosest(int[] nums, int target) {…