零基础学linux文件管理

news2025/1/15 18:39:18

目录

引言

基础知识

回顾C语言

fopen

fclose

更改进程路径:chdir

fwrite可以用来写入

sizeof字符串

C语言默认打开三个输入输出流

过渡到系统

系统调用:open

“位字段”或“位掩码”

open的使用

关闭文件:close

写入:write

OS文件管理

struct file结构

文件描述符表 

0 1 2去哪里了呢?

FILE* 和 fd什么关系呢?

stdout与stderr的区别

文件关闭机制


引言

Linux操作系统以其强大的稳定性、灵活性和开放性在多个领域占据重要地位。在Linux系统中,文件和目录构成了系统数据结构的基础,它们不仅存储着系统的配置信息、应用程序以及用户数据,而且在系统管理、资源共享和数据保护方面发挥着关键作用。因此,对于Linux用户,尤其是工程师和系统管理员来说,熟练掌握Linux文件和目录的管理技巧是不可或缺的。

本文将通过

以下三个话题,走进linux文件管理。

基础知识

1.学习文件管理,需要先具备一些基础知识。

2.一个文件被打开,必须加载到内存,并且一个进程可以打开多个文件。

在OS内部,一定存在大量被打开的文件,OS必须去管理这些文件----先描述再组织-----在内核中,一个被打开的文件,都必须有一个结构对象去管理这个文件。

3.std : 标准  I/O:输入输出

回顾C语言

fopen

fopen在stdio中io表示标准的输入输出,fopen用于打开一个文件。

第一个参数是:路径 (default : 当前目录下)+ 文件名

第二个参数是: 打开方式

需要特别注意的是,只要用w方式打开,无论何种方式,总是会先清空文件内容!

需要注意的是:两个参数都是const char*

fclose

文件资源打开后需要手动关闭!FILE* fp是文件指针

打开路径默认是当前路径,当前路径是什么呢?

我们可以在/proc中查看

如果打开一个进程,cwd就是当前路径。
同理,我们更改了cwd,就可以改变文件的默认创建路径。

更改进程路径:chdir

fwrite可以用来写入

(fprintf也可以,fprintf写入也遵循fread的打开方式)

fwrite 函数在写入时会从文件的当前指针位置开始覆盖数据,而不是清空整个文件

四个参数为:内容、大小、写入个数、写入哪个文件夹。

不需要 + 1,对于C而言/0是字符串的结尾,但是对于文件而言,不需要让/0作为字符串的结尾。

sizeof字符串

在C语言中,sizeof运算符用于确定一个数据类型或变量在内存中所占用的字节数。当使用sizeof来获取一个字符串的大小的时候,它计算的是字符串的字符数组总的字节大小,包括结尾的空字符\0。

例如,如果你有一个字符串"Hello",它在内存中实际上是一个字符数组{'H', 'e', 'l', 'l', 'o', '\0'}。因此,如果你使用sizeof来获取这个字符串的大小,你会得到6,这6包括了5个字母和一个结尾的空字符。

这里有一个例子:


#include <stdio.h>



int main() {

    char str[] = "Hello";

    printf("Size of str: %zu\n", sizeof(str)); // 输出将包括 '\0' 的字节数

    return 0;

}

如果str是一个字符数组并且是在栈上分配的,sizeof(str)会给出整个数组的大小,包括结尾的空字符\0。但是,如果你有一个指向字符串的指针,如下:

char *str = "Hello"; //在代码段

在这种情况下,sizeof(str)将会给出指针本身的大小,而不是字符串的大小。在32位系统上,这通常是4字节,在64位系统上,通常是8字节。要获取字符串的实际长度,你需要使用strlen函数,但是请注意strlen只计算到\0之前的字符数量,不包括\0本身。

在栈上的字符串sizeof = strlen + 1

当我们strlen(str) + 1时,会把/0也写进去,但是在vim中打开是乱码,这是因为在vim中某些字符也是不可显的

输出重定向(相对自身来说,内容是输出、是交出去,而不是输入):也是先清空

因此> 与>>的区别就是一个w一个a打开

当用a方式打开文件时,继续写入就是追加写入。

可见,写入的形式是清空重新写还是追加,由打开方式决定

C语言默认打开三个输入输出流

到后期就能明白,这三个输入输出流每种语言都会打开,只不过在C中的形式为std + in out err

C++为cin cout cerr

过渡到系统

我们读写一个文件,本质是对磁盘中的数据进行IO操作,磁盘是硬件。

想要访问硬件只能从上到下层层访问,必须经过OS,那就得用系统调用。

系统调用:open

有三个头文件

两个参数:路径(绝对或者相对)、打开方式

当文件存在时,用第一个打开

当文件不存在时,用第二个新建式的打开

参数二:

O_RDONLY,O_WEONLY,O_RDWR:分别为只读、只写、读写

O-APPEND为追加

O_CREAT为创建

“位字段”或“位掩码”

内部用按位与的逻辑,传参用按位或的逻辑

内部用 &的逻辑,由于32个比特中的数字除了0就是1,那么&之后,除非同一位的数字都为一,否则&之后变成0。外部用按位或的逻辑

按位与:只有都是1,才能变成1,想变成“真”的条件严格

按位或:只要有1,就能变成1,变成“真”的条件宽松

由于内部是if语句,当契合时,将调用对应的函数func。

open的第二个参数flags内部提供很多宏

宏里面只有一个bite为1,它可以传递多种标志位做按位或的组合,就能达到各种各样的效果(比如:只读、只写、读写、写创建、、、)

这种传参方式被称为“位字段”或“位掩码”(bit field 或 bit mask)。

在编程中,使用单个字节(或字)的每一位来表示不同的布尔选项或标志,是一种有效的内存使用技术。每个位可以独立地设置为0或1,代表不同的开关或配置选项,通过对这些位进行按位或操作(OR),可以同时传递多个标志。例如,在UNIX系统的文件权限设置中就使用了这种方式。

open的使用

返回一个文件描述符

失败返回 -1

当我们执行的时候,发现没有新建,也没有打开。

正确方式        

但是我们发现权限信息是乱码

为什么不对呢?open新建一个文件时,必须说明新建的权限(第三个参数)

我们用8进制的形式,来传递文件权限。

这样就获得了正常的权限

需要注意的是:权限 = 权限掩码 和 设置的权限共同作用的结果

调用了umask函数,它会影响你的进程及其后续创建的任何子进程的文件和目录权限。在进程的上下文中,这相当于修改了该进程的默认文件权限掩码。(不修改其他文件)

Linux下的系统调用在Windows中通常无法直接运行

 

这样就变成了666

关闭文件:close

        

写入:write

向一个文件中写入大小为count的字符串。

这种写入方法是:写入默认从文件开始处开始写(覆盖写,不清空)

 

清空O_TRUNC:truncate:截断

这种打开方式为:写入、创建、清空

追加O_APPEND:append

现在为:写入、创建、追加

如果文件log.txt已经存在,使用O_CREAT标志并不会导致创建一个新的文件,而是会打开现有的文件。只有当log.txt不存在时,O_CREAT标志才会与给定的权限一起使用来创建这个文件
因此,每次执行t1.exe时,如果log.txt已经存在,它将不会被重新创建,而是会被打开并且任何写入操作都会在文件的末尾追加内容。如果文件不存在,它将会被创建。

OS文件管理

OS内部将描述一个文件的打开信息

struct file结构

当我们打开多个文件,OS管理文件时,对文件链表的增删查改

文件被进程打开,如何知道哪个进程打开哪个文件呢?struct file 与 pcb的对应关系

文件描述符表 

在pcb中存在一个指针,指向了一个files_struct结构,这个结构内部包含了一个指针数组。

指针数组的类型是struct file*,这些指针元素指向了被OS管理的文件结构struct file。

这个指针数组被称为文件描述符表,元素的下标就是元素描述符!

因此我们用fd接收的文件打开的返回值,就是这个数组的下标。因此在写入的时候需要传入数组的下标,这样就能找到对应的文件。

发现这个打开的log.txt的文件描述符是

当我们多打开几个文件时         

按照数组的下标顺序排列。

0 1 2去哪里了呢?

前面已经说过了,进程启动的时候,会默认打开三个文件

我们向1号文件描述符对应的文件进行输出时,确实在显示器直接打印了输出信息。

从0号文件输入

读取count的大小字节的文件,读取到buf中。

从键盘文件中读取

发现进程进入阻塞状态(S+)

打开显示器、键盘文件不只是C的特性,而是OS的特性!进程会默认打开键盘、显示器、显示器,用来执行IO。

 

FILE* 和 fd什么关系呢?

FILE---C语言的一个结构体

stdin就是一个FILE*结构体

可以发现stdin stdout stderr确实文件描述符为 0 1 2

stdout与stderr的区别

将1文件(stdout:显示器)关闭之后,发现printf无法打印信息。这就说明了printf内部一定使用了1号文件stdout。

stdout关闭之后,仍然可以将数据输出到stderr(也是显示器文件)

结果:

为什么不是-1呢?这是因为printf认为已经向显示器中写入成功了。

这是因为stderr对应的文件描述符是2号,把1号关了,不管2的!

因此stdout与stderr是有区别的。

文件关闭机制

文件的关闭OS通过管理文件描述符表和struct file来实现的。在struct file中,还存在着引用计数器count。

多个进程可以同时打开一个文件。

因此文件关闭时,只需要让count--,将文件描述符表对应的指针置空即可。

如果count != 0,那么将继续执行功能,如果count == 0,那么将回收这个struct file。

因此,关闭1号文件描述符的文件,只是让count--,1号指针置空。

但是stderr的存在,显示器文件仍然没有被回收!

虽然stderr与stdout指向相同的struct file(OS的文件管理对象),但是stderr与stdout不相互干扰的原因:把1关闭之后,只需要让count--即可,但是不影响stderr的执行。

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

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

相关文章

【C++】继承与模板

继承 1.继承的概念 概念&#xff1a;继承(inheritace)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称之为派生类。继承呈现了面向对象程序设计的…

AI创作者与人类创作者的协作模式

公主请阅 1. AI创作者的崛起1.1 AI创作者的工作原理1.2 AI创作者的优势 2. 人类创作者的独特价值2.1 创造性与情感2.2 伦理与价值观2.3 文化与背景 3. AI与人类的协作模式3.1 协同创作3.2 内容编辑3.3 数据驱动的创作3.4 跨媒体协作 4. AI与人类协作的挑战4.1 技术局限性4.2 版…

Linux学习笔记 | sudo命令的基本使用

sudo命令 sudo 命令是 Unix 和 Linux 系统中用于执行需要超级用户权限&#xff08;即 root 权限&#xff09;操作的工具。它允许系统管理员授予某些用户&#xff08;或用户组&#xff09;以 root 或其他指定用户的权限来运行特定命令&#xff0c;而无需知道 root 用户的密码。…

在Java中,需要每120分钟刷新一次的`assetoken`,并且你想使用Redis作为缓存来存储和管理这个令牌

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

Uni-App-02

条件编译 条件编译概念 不同的运行平台终归有些专有的特性&#xff0c;无法实现跨平台完全兼容&#xff0c;例如&#xff1a;微信小程序导航栏右上角的关闭图标。 uni-app提供了一种“条件编译”机制&#xff0c;可以针对特定的平台编译执行特定的代码&#xff0c;否则不执行。…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架

【转载】理解图优化&#xff0c;一步步带你看懂g2o框架 文章来源&#xff1a;理解图优化&#xff0c;一步步带你看懂g2o框架 小白&#xff1a;师兄师兄&#xff0c;最近我在看SLAM的优化算法&#xff0c;有种方法叫“图优化”&#xff0c;以前学习算法的时候还有一个优化方法…

Spring Web MVC 入门

1. 什么是 Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从从⼀开始就包含在Spring框架中。它的 正式名称“SpringWebMVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"Spring MVC". 什么是Servlet呢? Ser…

OpenAI被爆12月发布其Orion AI模型!波兰“OFF”电台解雇所有记者,启用AI“主持人”|AI日报

文章推荐 Stability AI一口气推出3款图像生成模型系列&#xff01;升级版Claude 3.5 Sonnet能像人类一样操控电脑&#xff5c;AI日报 今日热点 据报道&#xff0c;OpenAI计划于12月发布其Orion AI模型 据The Verge昨日报道&#xff0c;OpenAI计划在今年12月之前发布其下一个…

ctfshow(171,172,173)--SQL注入--联合注入

Web171 进入靶场&#xff0c;是一个SQL查询界面&#xff1a; 审计&#xff1a; 查询语句如下&#xff1a; $sql "select username,password from user where username !flag and id ".$_GET[id]." limit 1;";语句功能从数据表user中查询username,pa…

MATLAB生态环境数据处理与分析

原文链接&#xff1a;MATLAB在生态环境数据处理与分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247624407&idx4&sn39c8119bba0797e6bf5cc35eea1c6767&chksmfa8da730cdfa2e266dac5221af101230d7ded29576a34856b31f736a89dbb2e3e481a5e94e8a&to…

日常笔记记录

1、Http 1.1 概念 HTTP 是 HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09;的简写&#xff0c;它是 TCP/IP 协议集中的一个应用层协议&#xff0c;是客户端与服务端进行交互时必须遵循的规则。它用于定义 Web 浏览器与 Web 服务器之间交换数据的过程以及…

【Docker】在AlmaLinux 8.10系统中安装Docker-ce过程分享

随着2024年6月30日&#xff0c;官方停止了对CentOS 7的维护&#xff0c;属于CentOS 7的时代终于结束了。当然&#xff0c;对于CentOS 7的维护停止&#xff0c;大家也不用过度紧张&#xff0c;目前仍有部分Linux版本可以提供企业级的生产可用系统服务&#xff0c;比如&#xff1…

Python记录-字典

定义 Python 中的字典&#xff08;dictionary&#xff09;是一种内置的数据结构&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。字典中的每个键&#xff08;key&#xff09;都是唯一的&#xff0c;并且与一个值&#xff08;value&#xff09;相关联。键…

vue3学习(二)一款优秀的编辑器

开源项目&#xff1a; https://github.com/Leecason/element-tiptap doc需要改成document&#xff0c;改完之后依然有问题&#xff0c;应该是对vue3兼容不好&#xff0c; 所以在issue中有人回复使用 https://github.com/okijhhyu/element-tiptap-vue3 经过测试&#xff0c;确实…

shiro会话管理和加密

Shiro 会话管理和加密 会话管理 缓存 加密 会话管理 Shiro提供了完整的企业级会话管理功能&#xff0c;不依赖于底层容器&#xff08;如Tomcat&#xff09;&#xff0c;不管是J2SE还是J2EE环境都可以使用&#xff0c;提供了会话管理&#xff0c;会话事件监听&#xff0c;会话存…

【自动化测试之oracle数据库】MacOs如何安装oracle- client

操作系统为Mac OS&#xff0c;本地在pycharm上跑自动化脚本时&#xff0c;因为有操作oracle数据库的部分&#xff0c;所以需要安装oracle数据库的客户端&#xff0c;并install cx_oracle,本文主要介绍如何在macOS上完成安装&#xff0c;并在python自动化测试代码中配置&#xf…

vue3项目中引入阿里图标库

开篇 本篇的主题是在vue3项目中引入阿里图标库 步骤 注册阿里图标库账号(阿里图标)&#xff0c;并创建项目 将图标加入项目中 将需要的图标先加入购物车&#xff0c;随后加入到项目中 生成项目代码 在项目中生成项目代码&#xff0c;便于后续复制到vue项目中 ## 在vue3项目…

信息安全入门——网络安全威胁

目录 前言网络安全威胁概览悄无声息的数据泄露——被动攻击明目张胆的破坏行为——主动攻击网路世界的瘟疫——病毒总结 前言 在数字化时代&#xff0c;信息安全成为了我们每个人都不得不面对的重要议题。网络安全威胁无处不在&#xff0c;它们可能来自网络的暗角&#xff0c;…

MySQL 9从入门到性能优化-慢查询日志

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

【51单片机】第一个小程序 —— 点亮LED灯

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 单片机介绍LED灯介绍练习创建第一个项目点亮LED灯LED周期闪烁 单片机介绍 单片机&#xff0c;英文Micro Controller Unit&#xff0…