【Linux基础IO】常见的对文件操作的函数、文件描述符fd、访问文件的本质分析

news2024/7/4 5:09:23

目录

fopen函数

chdir函数

fclose函数

 fwrite和fread函数

open函数

umask函数

write函数

 read函数

close函数

文件描述符fd

进程访问文件的本质分析


fopen函数

参数mode:

 w方式打开文件:1、如果被打开文件不存在,系统会在使用fopen函数的进程的工作目录下创建一个新文件,文件名就是参数path。2、w方式打开文件系统会将文件的内容截断清空。

 a方式打开文件:1、如果被打开文件不存在,系统会在使用fopen函数的进程的工作目录下创建一个新文件,文件名就是参数path。2、a方式打开文件,向被打开文件写入内容在有内容的后面续写。

我们来验证一下1、如果被打开文件不存在,系统会在使用fopen函数的进程的工作目录下创建一个新文件,文件名就是参数path。(我们可以通过  ll /proc/进程PID  这一指令查看进程的cwd即进程的目前工作目录来验证;利用chdir函数来改变进程的cwd从而得以验证)。注意:/proc目录中是正在运行的进程

chdir函数

不改变进程的cwd在进程内部使用fopen函数在进程的cwd下创建一个新的文件:

改变进程的cwd:

函数的返回值:

返回被打开文件的地址,类型为FILE*,打开文件失败则返回NULL

fclose函数

 fwrite和fread函数

open函数

 常见的lags参数:

O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。使用 mode 参数来指明新文件的访问权限.
O_APPEND: 追加写

umask函数

write函数

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{
 umask(0);
 int fd = open("myfile", O_WRONLY|O_CREAT|O_TRUNC, 0644);
 if(fd < 0){
 perror("open");
 return 1;
 }
 int count = 5;
 const char *msg = "hello bit!\n";
 int len = strlen(msg);
 while(count--){
 write(fd, msg, len);//msg:缓冲区首地址   len: 本次读取,期望写入多少个字节的数
据。 返回值:实际写了多少字节数据
 }
 close(fd);
 return 0;
}

 read函数

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{
 int fd = open("myfile", O_RDONLY);
 if(fd < 0){
 perror("open");
 return 1;
 }
 const char *msg = "hello bit!\n";
 char buf[1024];
 while(1){
 ssize_t s = read(fd, buf, strlen(msg));//类比write
 if(s > 0){
 printf("%s", buf);
 }else{
 break;
 }
 }
 close(fd);
 return 0;
}

close函数

 open、write、read、close函数其实都是对文件操作的系统调用接口。库函数fopen、fread、fwrite、fclose内部都是封装了上面对应的系统接口!

文件描述符fd

Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2。
0,1,2对应的物理设备一般是:键盘,显示器,显示器
  输入输出可以采取如下方式:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main()
{
 char buf[1024];
 ssize_t s = read(0, buf, sizeof(buf));
 if(s > 0){
 buf[s] = 0;
 write(1, buf, strlen(buf));
 write(2, buf, strlen(buf));
 }
 return 0;
}

进程访问文件的本质分析

1、首先我们来重新认识一下文件:

文件 = 文件内容 + 文件属性    文件分为打开的文件和没有打开的文件。

文件被打开必须要加载到内存里。

而在操作系统中其实是进程打开了文件!-----研究文件打开本质是研究文件和进程之间的关系

没有打开的文件是存放在磁盘上的,磁盘是外部设备,根据冯诺依曼体系访问文件就等于访问硬件,由于操作系统不允许用户直接访问它内部的硬件数据,因此操作系统提供了相应的系统调用供用户对文件进行操作,并且一般都是对文件操作的库函数封装了相应系统调用。例如:fprintf函数是向显示器文件流stdout、stderr中输入内容然后由显示器硬件将内容显示出来。

当我们打开文件时,操作系统会在内存中创建相应的数据结构来描述该文件。于是就有了上图中的file结构体,表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct该表最重要的部分就是存储该进程打开的文件的文件结构体对象地址的指针数组,该指针数组每个元素都是一个指向打开文件结构体对象的指针!所以,本质上,文件描述符就是该数组的下标。所以通过文件描述符就可以找到对应的文件。
操作系统什么时候回收描述被打开文件的结构体对象呢?
通常可能会有多个进程同时打开一个文件,因此多个进程的表files_struct都包含这个描述文件的结构体对象地址,其实这个被打开文件的结构体对象里存储了一个int count变量用来存储有几个进程正在打开它,当一个进程不再关闭了该文件时--count直到0 == count操作系统就会回收描述该文件的结构体对象。

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

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

相关文章

DGit的使用

将Remix连接到远程Git仓库 1.指定克隆的分支和深度 2.清理&#xff0c;如果您不在工作区上工作&#xff0c;请将其删除或推送至 GitHub 或 IPFS 以确保安全。 为了进行推送和拉取&#xff0c;你需要一个 PAT — 个人访问令牌 当使用 dGIT 插件在 GitHub 上推送、拉取、访问私…

火灾数据的另一个下载源 MOD14 MODIS火灾检测和热异常数据集

地图资源工具&#xff0c;有对于同一种数据会有多个数据源&#xff0c;起火点数据除了下载全球范围内的实时和历史火灾数据矢量下载源外 还有另一个火灾数据的栅格下载源 利用地图资源工具下载&#xff0c; 下载方式基本统一&#xff0c;可以最大程度简化您数据获取的操作并节省…

CSS打印设置页眉页脚

之前写过一篇文章CSS实现自动分页打印同时每页保留重复的自定义内容&#xff0c;可以实现window.print()打印时多张页面保留相同的内容&#xff08;如header、footer&#xff09;&#xff0c;但其并不是真正意义上的页眉页脚&#xff0c;footer内容在最后一张页面未撑满时不能置…

MyBatis系列四: 动态SQL

动态SQL语句-更复杂的查询业务需求 官方文档基本介绍案例演示if标签应用实例where标签应用实例choose/when/otherwise应用实例foreach标签应用实例trim标签应用实例[使用较少]set标签应用实例[重点]课后练习 上一讲, 我们学习的是 MyBatis系列三: 原生的API与配置文件详解 现在…

【proteus仿真】基于51单片机的秒表设计

【proteus仿真】基于51单片机的秒表设计 资料获取在文章结尾处&#xff01; 更多资料获取链接&#xff1a; https://docs.qq.com/sheet/DTExIc2dPUUJ5enZZ?tabBB08J2 1.资料内容 源码proteus仿真图 演示视频&#xff1a; 【proteus仿真】基于51单片机的秒表设计_哔哩哔…

注意力机制和Transformer模型各部分功能解释

文章目录 Transformer1、各部分功能解释2、通过例子解释a.输入预处理位置编码b.Encoder 的处理c.Decoder的输入Decoder的工作流程d.输出预测总结 Attention代码和原理理解 Transformer 运行机理&#xff1a; &#xff08;1&#xff09;假设我们需要进行文本生成任务。我们将已…

TikTok养号新手保姆级教程

对于很多刚开始运营TikTok的新手小白来说&#xff0c;都会有一个同样的疑问&#xff0c;那就是&#xff1a;TikTok到底需不需要养号&#xff1f;这里明确告诉大家是需要养号的&#xff0c;今天就把我自己实操过的养号经验和策略总结出来&#xff0c;分享给大家。 一、什么是Ti…

Android 配置蓝牙遥控器键值

文章目录 篇头一、规格书二、红外按键配置三、蓝牙按键配置3.1 查看设备号3.1.1 方式一&#xff1a;dumpsys input3.1.2 方式二&#xff1a; cat /proc/bus/input/devices 3.2 配置kl文件3.2.1 方案商原始配置3.2.2 Generic.kl 文件3.2.3 重映射蓝牙按键3.2.4 完成 Vendor\_568…

Boosting原理代码实现

1&#xff0e;提升方法是将弱学习算法提升为强学习算法的统计学习方法。在分类学习中&#xff0c;提升方法通过反复修改训练数据的权值分布&#xff0c;构建一系列基本分类器&#xff08;弱分类器&#xff09;&#xff0c;并将这些基本分类器线性组合&#xff0c;构成一个强分类…

git提交遇见的<<<<<<<< HEAD无法运行程序问题

在项目文件目录下打开git bash Here 在命令行中输入 git reset --hard HEAD~1 进行复原 git reset --hard HEAD~1 即可

基于Java + Swing + MySQL的学生选课及成绩管理系统(Java课程设计)

目录 开发工具系统结构功能展示登录与注册界面&#xff08;通用&#xff09;主界面&#xff08;通用&#xff09;学生信息查询界面&#xff08;学生用户&#xff09;学生信息管理界面&#xff08;教师用户 管理员用户&#xff09;学生选课界面&#xff08;学生用户&#xff09;…

跟TED演讲学英文:A tale of mental illness -- from the inside by Elyn Saks

A tale of mental illness – from the inside Link: https://www.ted.com/talks/elyn_saks_a_tale_of_mental_illness_from_the_inside Speaker: Elyn Saks Date: June 2012 文章目录 A tale of mental illness -- from the insideIntroductionVocabularySummaryTranscriptA…

【C语言】数组参数和指针参数详解

在写代码的时候难免要把【数组】或者【指针】传给函数&#xff0c;那函数的参数该如何设计呢&#xff1f; 1 一维数组传参 #include <stdio.h> void test(int arr[])//ok? {} void test(int arr[10])//ok? {} void test(int* arr)//ok? {} void test2(int* arr[20])…

爬虫可以做什么?Python爬虫入门必看保姆级教程!(学习资源+学习路线)

一、什么是爬虫&#xff1f; Python爬虫&#xff0c;也称为Python网络爬虫或网页蜘蛛&#xff0c;是一种使用Python编程语言编写的程序&#xff0c;用于自动地抓取互联网上的信息。这种程序按照预设的规则&#xff0c;模拟浏览器请求站点的行为&#xff0c;从网站上抓取数据并…

【长春理工大学主办 | EI检索稳定 | SPIE出版 | 过往4届均检索 】第五届计算机视觉和数据挖掘国际学术会议(ICCVDM 2024)

第五届计算机视觉和数据挖掘国际学术会议&#xff08;ICCVDM 2024&#xff09; 2024 5th International Conference on Computer Vision and Data Mining 会议简介 第五届计算机视觉与数据挖掘国际学术会议&#xff08;ICCVDM 2024&#xff09;将于2024年7月19-21日在中国长春…

中国剩余定理——AcWing 204. 表达整数的奇怪方式

中国剩余定理 定义 中国剩余定理最早出自我国古代的《孙子算经》&#xff0c;是数论中的一个重要定理。它描述了这样一种情况&#xff1a;在模运算下&#xff0c;对于一组线性同余方程组&#xff0c;存在唯一解的条件和求解方法。 运用情况 常用于在一些涉及到按不同模的余…

ROS std_msgs消息包

ROS std_msgs消息包 基本概述 std_msgs 是 ROS&#xff08;Robot Operating System&#xff09;的一个核心消息包&#xff0c;包含了一系列基本的消息类型&#xff0c;这些类型用于节点之间的标准通信。std_msgs 中的消息类型设计得非常简单&#xff0c;以便用作更复杂消息的…

IO读取properties文件实现JDBC连接池实战

参考文章 Java中的池化思想 面试官&#xff1a;为什么数据库连接很消耗资源&#xff0c;资源都消耗在哪里&#xff1f; 池化思想是什么&#xff1f;连接池是什么&#xff1f; 在Java中&#xff0c;池化思想是一种通过创建和管理可重复使用的对象池来提高性能和资源利用率的编…

GitHub星标破千Star!Python游戏编程的初学者指南

Python 是一种高级程序设计语言&#xff0c;因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。 目前的编程书籍大多分为两种类型。第一种&#xff0c;与其说是教编程的书&#xff0c;倒不如说是在教“游戏制作软件”&#xff0c;或教授使用一种呆板的语言&#x…

深入解析纹理贴图——纹理压缩技术

by STANCH 标签&#xff1a;#纹理压缩 #纹理贴图 1.纹理压缩概述 3D计算机图形学离不开各种类型的纹理。纹理贴图可以极大地提高3D物体的视觉质量和细节水平,而不增加几何复杂度。简单的纹理是二维图像&#xff0c;该图像的单个像素称为纹素(texel)。事实上,纹理不仅可以存储…