Linux学习笔记之文件
1.文件
1.1文件属性
当我们创建文件时,文件就有了对应的属性,可以用mkdir创建目录,touch创建普通文件。用ls -al查看文件属性。
从上图可以看出目录或者文件的所有者,所属组,其他人权限,创建时间等信息。由此我们便可以得到,一个结论,文件创建出来,即使我们没有写入任何的数据,他也是有大小的。使用stat可以查看文件的详细信息。
stat test.c
这里大小显示为0并不是没有占内存,而是大小不足一字节,所以显示为0.
文件=文件内容+属性
1.2 文件存储位置
当文件没有被打开使用时,如果把他放他被放置在系统的磁盘中,但当文件打开时,他就会被加载到内存中。CPU只会与内存进行数据处理,使用文件前必须打开文件说的也就是把文件从磁盘加载到内存中,让CPU进行数据处理。
1.3 文件与进程关系
当我们在修改文件时,在Windows中会默认打开记事本,在Linux中使用vim或者nano。实际上我们不会之间修改文件,而是通过软件修改,其实就是通过进程修改文件。我们要学习文件管理就是在学习OS进程管理与文件管理之间的关系。
1.4如何管理文件
一个进程可以打开多个文件,多个进程可以打开很多文件,在OS中,这些文件分布在内存的各个地方,为了管理这些文件,Liunx必定会 先描述,在组织。即在使用struct结构体包含文件信息,然后再组织管理起来。如下图
在Liunx中学习文件操作,就是学习进程管理与文件管理之间的关系。
2.C语言文件操作
在C语言中,可以使用fopen打开文件,fwrite,fputs,fprintf等写入文件。
2.1 fopen
path参数是文件地址,可以采用绝对地址,也可以采用想对地址。第二个参数是文件打开方式。函数失败返回空指针。
2.1.1 文件打开方式
文件打开方式主要有6种,a,w,r及其附加类
- r 以只读方式打开文件,(不可以修改文件)从文件开头读取。
- r+ 以读写方式打开文件,从文件开头读取。
- w 以写方式打开文件,文件存在清除,不存在创建新文件,从文件开头写入
- w+ 以写方式打开文件,文件存在清除,不存在创建新文件,可以读取文件内容,从文件开头写入
- a 以追加写入方式打开文件,文件不存在则创建,从文件结尾写入
- a+ 以追加读取写入方式打开文件,文件不存在则创建,从文件结尾写入。但读取从文件开头开始读取
总而言之,C语言提供了丰富的文件接口使用。不同场景下使用合适的方式。
#include<stdio.h>int main()
{FILE * fp=fopen("hello.txt","w");//不加路径则默认为当前路径下fprintf(fp,"%s","hello files!\n");fclose(fp);return 0;
}
运行上述程序后,会在当前目录下生成hello.txt文件。
2.2 fclose
使用起来相对简单,只需要把文件指针传入即可。
在打开文件后,必须要关闭文件,当我们在修改文件时,文件数据是在内存中的,如果直接结束进程,内存中的数据被释放,文件修改后的数据就可能不存在了。关闭文件实际上就是把在内存中的文件写入到磁盘当中去。
2.3 默认打开文件
当C语言程序运行时,就会默认打开三个文件。
- stdin 标准输入 (一般为键盘)
- stdout 标准输出 (一般为显示器)
- stderr 标准错误 (一般为显示器)
2.3.1 键盘与显示器为什么是文件
OS是软硬件资源的管理者,对上要提供良好的开发环境,对下要管理好硬件。实际上OS要管理好硬件,就是要做好对于数据的IO操作,从硬件读取数据,或者是向硬件写入数据。
对于硬件来说,他会有许多,OS为了管理硬件,一定会先描述在组织,对下管理硬件资源。创建hardware_struct,里面有设备名称,硬件编号,以及函数指针等。其中的函数指针就是为了读写操作准备的。
由此,当我们想要向硬件写入的时候,不必关注底层硬件设计,只需要使用write函数即可,剩下的交给硬件驱动。这就是Linux下的一切皆文件的实现方式。
实际上驱动程序主要就是IO操作相关的函数,所以向电脑插入一个设备的时候,电脑首先就会查看有没有相关的驱动程序,如果没有就运行不了。我们之前学习的C语言函数就是对应上图的函数库操作。
3.系统文件操作
根据之前的操作系统图,C语言函数一定是封装了系统调用接口的。OS不允许用户越过自己直接访问硬件。(当然单片机除外,简单的单片机没有OS)
3.1 open
open就是操作系统提供的打开文件操作。
int open(const char *pathname, int flags);该函数第一个参数是文件路径,第二个参数是标记位,可以选择对文件如何操作。有如下主要选项。
O_RDONLY
:以只读方式打开文件。O_WRONLY
:以只写方式打开文件。O_RDWR
:以读写方式打开文件。O_CREAT
:如果文件不存在,则创建该文件。使用此标志时,需要提供第三个参数mode
来指定文件的权限。O_TRUNC
:如果文件存在且以可写方式打开,则将文件截断为零长度。O_APPEND
:以追加方式打开文件,每次写操作都会将数据追加到文件末尾。
上述标记位可以组合使用,用 | 分隔开。例如O_WRONLY | O_CREAT | O_TRUNC 就可以达到C语言fopen中W的效果,或者说C语言a,r,w就是open不同选项封装的。
3.1.1 返回值
返回值是int,没有看错,返回值就是朴实无华的int。在Linux进程中我们必定要管理文件,但是一个int类型怎么指向一个文件?怎么根据int确定是那个文件。
运行下述代码。
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{int f1=open("text1",O_WRONLY|O_CREAT);int f2=open("text2",O_WRONLY|O_CREAT);int f3=open("text3",O_WRONLY|O_CREAT);int f4=open("text4",O_WRONLY|O_CREAT);int f5=open("text5",O_WRONLY|O_CREAT);printf("f1:%d f2:%d f3:%d f4:%d f5:%d",f1,f2,f3,f4,f5);return 0;
}
我们可以发现如果我们连续打开文件,这是一连串的数字从3开始。计算机中有什么结构有如此规整的数字么?答案显然是数组,至于为什么从3开始,因为我们每个进程默认打开三个文件,标准输入,标准输出,标准错误。
实际上进程就是使用数组来管理文件的,如下图。
3.1.2 标记位如何实现
实际上flags就是个32位的位图,每个O_RDONLY,O_WRONLY都是宏定义,且是某个比特位为1的特殊值。如下图
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{printf("%d %d %d %d\n",O_RDONLY,O_WRONLY, O_CREAT,O_TRUNC);return 0;
}
|实际上就是按位或,有1为1,这样在传入参数后,可以根据每个比特位的情况来实现不同的功能,而避免写过多的函数。
3.1.3 open
在 C 语言里并没有像 C++ 那样的函数重载机制,C 语言要求函数名必须唯一。不过在 Linux 系统中,
open
函数存在两种不同参数列表的形式,这并非是通过函数重载实现的,而是借助预处理器和编译器的协作来达成的。
int open(const char *pathname, int flags, mode_t mode);前两个参数与之前一样,第三个参数是设置文件的权限。
这里使用数字,实际上也是运用位图的思想,每个选项对应一个比特位。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main() {open("hello.txt", O_TRUNC | O_WRONLY|O_CREAT, 0777);//这里0777表示8进制,二进制为 0 111 111 111return 0;
}
运行上述程序,得到如下结果。
但看起来与我们设置的777不符合,为0775,这是因为还有掩码umask作用,真实权限是将默认权限值与 umask 值按位取反的结果进行按位与运算。简单记位减去掩码就是真正的权限。(权限=open设置-掩码)
111 111 111 (默认权限)
111 111 101 (取反后的掩码位)
---------------
111 111 101 (计算结果)
3.2 close
这个是Linux系统提供的接口,可以关闭文件,他的参数比较特殊是fd,就是文件在进程管理数组中的下标。关闭成功返回0,失败返回-1.
标准输入,标准输出,标准错误也是文件,在数组下标为0,1,2.一定也可以被关闭。如下代码。
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{close(2);int f1=open("text1",O_WRONLY|O_CREAT);int f2=open("text2",O_WRONLY|O_CREAT);int f3=open("text3",O_WRONLY|O_CREAT);int f4=open("text4",O_WRONLY|O_CREAT);int f5=open("text5",O_WRONLY|O_CREAT);printf("f1:%d f2:%d f3:%d f4:%d f5:%d\n",f1,f2,f3,f4,f5);return 0;
}
可以发现下标从2开始。在运行下述程序,关闭0号文件。
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{close(0);int f1=open("text1",O_WRONLY|O_CREAT);int f2=open("text2",O_WRONLY|O_CREAT);int f3=open("text3",O_WRONLY|O_CREAT);int f4=open("text4",O_WRONLY|O_CREAT);int f5=open("text5",O_WRONLY|O_CREAT);printf("f1:%d f2:%d f3:%d f4:%d f5:%d\n",f1,f2,f3,f4,f5);return 0;
}
此时下标从1开始,由此我们可以得出下标的分配是从最小的没开始用的数组下标开始。
相关文章:

Linux学习笔记之文件
1.文件 1.1文件属性 当我们创建文件时,文件就有了对应的属性,可以用mkdir创建目录,touch创建普通文件。用ls -al查看文件属性。 从上图可以看出目录或者文件的所有者,所属组,其他人权限,创建时间等信息。由…...
LLM学习
1、基础概念篇 大模型训练三部曲Pretraining SFT RLHF...

Classic Control Theory | 13 Complex Poles or Zeros (第13课笔记-中文版)
笔记链接:https://m.tb.cn/h.TtdexbP?tkeFAlejKBSzQhttps://m.tb.cn/h.TtdexbP?tkeFAlejKBSzQ...

给小米/红米手机root(工具基本为官方工具)——KernelSU篇
目录 前言准备工作下载刷机包xiaomirom下载刷机包【适用于MIUI和hyperOS】“hyper更新”微信小程序【只适用于hyperOS】 下载KernelSU刷机所需程序和驱动文件 开始刷机设置手机第一种刷机方式【KMI】推荐提取boot或init_boot分区 第二种刷机方式【GKI】不推荐 结语 前言 刷机需…...

【MySQL】表的增删查改(CRUD)(上)
个人主页:♡喜欢做梦 欢迎 👍点赞 ➕关注 ❤️收藏 💬评论 CRUD:Create(新增数据)、Retrieve(查询数据)、Update(修改数据)、Delete(修改数据…...
测试用例的Story是什么?
测试用例的 Story(用户故事)是指描述某个功能或场景的具体用户需求,它通常以简短的业务背景用户操作期望结果的方式呈现,使测试人员能够理解测试的目标和价值。用户故事能够帮助团队更好地设计测试用例,确保功能满足用…...
15.4 FAISS 向量数据库实战:构建毫秒级响应的智能销售问答系统
FAISS 向量数据库实战:构建毫秒级响应的智能销售问答系统 关键词:FAISS 向量数据库、销售知识库构建、相似度检索优化、大规模问答匹配、量化索引技术 1. 销售问答场景的向量化挑战与解决方案 1.1 传统检索方案痛点分析 #mermaid-svg-AeVgih79asJb7lb8 {font-family:"…...

Golang笔记——Interface类型
大家好,这里是,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Golang的interface数据结构类型,包括基本实现和使用等。 文章目录 Go 语言中的 interface 详解接口定义实现接口空接口 interface{} 示例&…...

如何查看图片的原始格式
问题描述:请求接口的时候,图片base64接口报错,使用图片url请求正常 排查发现是图片格式的问题: 扩展名可能被篡改:如果文件损坏或扩展名被手动修改,实际格式可能与显示的不同,需用专业工具验证…...

FreiHAND (handposeX-json 格式)数据集-release >> DataBall
FreiHAND (handposeX-json 格式)数据集-release 注意: 1)为了方便使用,按照 handposeX json 自定义格式存储 2)使用常见依赖库进行调用,降低数据集使用难度。 3)部分数据集获取请加入:DataBall-X数据球(free) 4)完…...

【Rust中级教程】2.8. API设计原则之灵活性(flexible) Pt.4:显式析构函数的问题及3种解决方案
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 说句题外话,这篇文章一共5721个字,是我截至目前写的最长的一篇文章&a…...

LabVIEW Browser.vi 库说明
browser.llb 库位于C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform目录,它是 LabVIEW 平台下用于与网络浏览器相关操作的重要库。该库为 LabVIEW 开发者提供了一系列工具,用于实现网页浏览控制、网页数据获取与交互等功能&a…...
promise的方法有哪些?【JavaScript】
Promise对象在JavaScript中是一种处理异步操作的方式,它提供了一组方法来管理和控制异步操作的结果。以下是一些常用的Promise方法: 以下是对 constructor(executor)、then(onFulfilled, onRejected)、catch(onRejected)、 finally(onFin…...
基于模仿学习(IL)的端到端自动驾驶发展路径
基于模仿学习(IL)的端到端自动驾驶发展路径 1. 核心论文解析 (1) UniAD:感知-规划一体化 核心思想:首次提出将感知任务(如目标检测、车道线识别、轨迹预测)与规划任务集成到统一的端到端框架中ÿ…...
第1篇:SOLR 简介与源码环境搭建
第1篇:SOLR 简介与源码环境搭建 1.1 SOLR 是什么? Apache SOLR 是一个基于 Apache Lucene 的高性能开源搜索平台。它不仅继承了 Lucene 强大的全文搜索能力,还通过封装和扩展,提供了企业级的功能,比如分布式搜索(SolrCloud)、RESTful API、动态 Schema 管理等。自 200…...
Docker 搭建 Redis 数据库
Docker 搭建 Redis 数据库 前言一、准备工作二、创建 Redis 容器的目录结构三、启动 Redis 容器1. 通过 redis.conf 配置文件设置密码2. 通过 Docker 命令中的 requirepass 参数设置密码 四、Host 网络模式与 Port 映射模式五、检查 Redis 容器状态六、访问 Redis 服务总结 前言…...
MySQL 连表查询:原理、语法与优化
目录 引言 什么是连表查询? 连表查询的类型 1. 内连接(INNER JOIN) 2. 左连接(LEFT JOIN) 3. 右连接(RIGHT JOIN) 4. 全连接(FULL JOIN) 5. 交叉连接(…...
实战技巧:如何快速提高网站收录的权威性?
快速提高网站收录的权威性是一个系统性的工作,涉及内容质量、网站结构、外部链接、用户体验等多个方面。以下是一些实战技巧,可以帮助你快速提升网站收录的权威性: 一、提升内容质量 原创性: 确保网站内容具备高质量与原创性&a…...

vue语法v-model例子单选题和多选题
<template><!-- 单选框 --><input type"radio" v-model"danxuan" value"a"><label for"a">a</label><input type"radio" v-model"danxuan" value"b"><label fo…...

计算机网络面试知识点总结
目录 1. 计算机网络的基本知识点2. OSI 七层模型3. TCP/IP 四层模型4. TCP 和 UDP4.1 TCP 协议4.2 TCP 流量控制4.3 TCP 拥塞控制4.4 TCP 三次握手4.5 TCP 四次挥手4.6 TCP 粘包问题4.7 TCP Socket交互流程4.8 UDP 协议以及和 TCP 协议的不同 5. HTTP协议5.1 HTTP 请求方法以及…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...