Linux操作系统——文件详解

这篇具有很好参考价值的文章主要介绍了Linux操作系统——文件详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.文件理解预备知识

首先,当我们在磁盘创建一个空文件时,这个文件会不会占据磁盘空间呢?

答案是当然会占据磁盘空间了,因为文件是空的,仅仅指的是它的内容是空的,但是该文件要有对应的文件名,文件的大小,文件的创建时间,文件的权限等等,这些叫做文件的属性,是一个往往被人们所忽略的非常关键的一个点,所以我们都说文件=内容+属性。

1.所有对文件的操作,无非就两种操作:a.对内容做操作   b.对属性做操作

2.文件内容是数据,文件属性也是数据 ---- 所以说存储文件既是存储内容数据,也是存储属性数据 ----- 默认就是在磁盘上的文件。

3.我们要访问一个文件的时候,都是要先把这个文件先打开。

这里所说的我们指的是谁呢?是指我们用户吗?

我们平常在写我们的c语言代码来对文件进行操作的时候并不是写好了这个文件就会通过fopen函数直接打开了,而是要通过将代码运行起来编译形成可执行程序将其加载到内存中,然后变成进程进而来打开文件并对文件进行操作的,所以说这里的我们指的是进程,而并不是指的我们用户。 

我们下面再来谈谈文件打开前与文件打开后的状态。

文件打开前:普通的磁盘文件   文件打开后:将文件加载到内存。我们上面说文件是存储在磁盘上的,既然要将文件加载到内存,根据冯诺依曼体系结构,那么就必然要涉及到访问磁盘设备,而访问磁盘设备只有操作系统有资格来访问,所以这一步必定是操作系统来做。

4.一个进程可以打开多个文件吗?多个进程可以打开多个文件吗?

加载到内存中被打开的文件可能会存在多个。进程:打开的文件 = 1:n

所以根据2、3、4这几点我们可以知道操作系统在运行中,可能会打开很多个文件,那么操作系统就需要对这些文件进行管理。那么如何管理呢?先描述,在组织。

一个文件要被打开,一定要先在内核中形成被打开的文件对象,说白了就是在c语言上我们需要用struct结构体来对文件进行描述,然后用链表链接起来,所以对文件的管理就转化成了对链表的增删查改。

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

其实说的更准确一点就是一个进程是通过操作系统来打开文件的,而操作系统不相信任何人,所以操作系统一定要给我们提供系统调用接口。

5.文件按照是否被打开分为  被打开的文件和没有被打开的文件

其中被打开的文件是存在于内存中的,而没有被打开的文件存在于磁盘中。

6.研究本次文件操作的本质:进程与被打开文件的关系

2.复习常见C语言的文件接口

我们先来看看c语言对文件操作的一些接口

打开文件接口:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

写入文件接口:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

关闭文件接口:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

利用这些接口我们用以下代码进行测试:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

运行结果:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

然后我们把代码修改成如下方式来进行测试:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

运行结果:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

发现我们之前写入到log.txt的内容不见了,只剩下了刚刚新写入的内容。

而我们打开文件有以下几种方式来进行打开:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

我们刚刚是以w的方式打开文件的,也就是写的方式:这种方式打开文件,如果文件不存在就会创建一个新的文件,如果需要打开的文件存在就会先清空文件中的内容,然后再打开文件进行写入。

用重定向的方式来写就是:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

下面我们以a方式进行打开文件测试:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

运行结果:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

发现追加在了后面,这种a方式打开文件也是写入,只不过不会清空文件,而是在文件结尾处进行写入,也就是追加,不会清空文件内容。

同时也可以用重定向的方式对文件内容进行追加:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

还有一种方式是以读的方式打开文件,也就是r方式。

3.认识系统调用接口,操作文件

我们学习的c语言打开文件的接口,底层一定封装了系统调用接口!!!

下面我们看一下打开文件的系统调用接口的手册:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

这里的open接口有两个参数的接口,也有三个接口的参数,我们下面会来进行介绍,而这个open还有一个int类型的返回值,这个返回值叫做文件描述符fd.

我们先来对open接口的第二个参数来进行理解:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

这里的flags我们称之为标志位,是一个int类型的整数,它里面有32个bit位,所以理论上我们可以用这32个bit位为0为1进行分别传参,如果要传一个标志位,那我们就可以用第一个比特位来表示,如果要传两个标志位,那么我们就可以用第一第二个比特位来表示,三个标志位就用三个,十个就用是个bit位来传。所以这个参数可以同时传递多个标志位的,而我们的标志位有O_RDONLY(只读标志位),O_WRONLY(只写标志位),O_RDWR(读写标志位)等等。这些大写的标志位都是用宏来定义的。

下面我们写一段测试代码来进行理解:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

然后运行:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

所以我们可以通过宏的方式为接口传递多个标志位。

下面我们再对open接口进行测试:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

我们先把之前创建的文件都删除了,然后重新执行这段代码:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

我们发现确实形成了一个log.txt的文件,可是为什么是红色的呢?同时它的权限也很奇怪,当我们创建文件的时候,必定是要经过linux权限创建的,但是我们刚刚创建该文件的时候并没有指明该文件的权限,所以log.txt这个临时文件的权限是一个乱码式的权限。

如果我们用open接口来打开文件,如果文件不存在,那就需要在使用open接口的时候给文件传递一个权限参数:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

也就是调用这个接口:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

我们先把之前的log.txt这个临时文件删除了然后重新执行上述代码:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

我们发现权限跟我们传进去的并不一致,我们设置的是0666,应该是显示-rw-rw-rw-的,可是发现最后一个权限w不见了。原因就在于我们创建一个文件时在我们系统中有一个默认的权限掩码umask:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

默认是0002,但是如果我们就是想要设置为0666呢?

那么我们就可以通过修改umask权限掩码为0即可

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

然后运行之后:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

发现权限变回了0666.但是一般我们都不会去修改系统的umask.

下面我们对文件进行操作:

先看一个写文件的系统调用接口:write

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

使用该write接口,其中fd是文件描述符,buf是字符串首地址,count是需要写入的大小。

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

运行之后:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

下面我们再修改代码:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

把写入的内容修改一次

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

发现在open接口中以只写的方式打开文件如果文件不存在会创建文件,如果文件存在不会清空文件,而是从文件的开始对文件内容进行覆盖式的写入,如果我们想像c语言那个接口那样先清空文件内容再写入该怎么写呢?其实很简单,只需要在标志位上再加上一个O_TRUNC这个宏即可,下面把代码进行修改:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

运行结果:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

c语言中还有一种追加的方式打开文件,在系统调用接口open需要传参O_APPEND标志位即可,即把代码改成:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

运行结果:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

我们发现文件内容是追加上去的。

4.尝试着理解文件,打通语言与系统关于文件部分的理解

所以我们通过上述的说明可以知道如下结论:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

除了了解了这些open系统调用参数,想必大家也一定对我们的open的返回值fd比较好奇是什么吧,下面我们就对这个fd进行测试:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

一个进程可以打开多个文件

运行之后:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

文件描述符分别是3,4,5,6,同时四个文件也创建出来了。

我们发现这是一个连续的小整数逐渐递增的,我们平时遇到这种都是以数组下标最为常见,而且我们也发现怎么没有0,1,2呢?

理解文件在操作系统中的表现:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

那么0,1,2去哪了呢?

我们看一下linux内核中源代码进程结构体中的files_struct* 

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

以上都是内核源代码中跟文件有关的结构体。

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

进程在运行的时候默认打开标准输入流,标准输出流,标准错误流三个文件,他们对应的文件描述符分别是0,1,2 。

通过上述的说明,我们知道,操作系统访问文件,只认文件描述符!!!

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

那么我们前面谈到的c语言库函数中的FILE是什么东西呢?是一个C语言提供的结构体类型,既然是结构体,那么这个结构体里面必定封装了文件描述符!!!如何证明呢?

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

运行结果:

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

所以我们初步得出了一个结论,不仅仅是fopen底层封装了open系统调用接口,文件的结构体类型也进行了封装。所以操作系统只认fd.

1.操作系统为什么要把0,1,2 ,stdin,stdout,stderr打开呢?

就是为了让程序员默认进行输入输出代码编写!

2.stderr是什么呢?

3.如何理解一切皆文件?

我们的设备像显示器,键盘,网卡,声卡,扬声器等等这些都是可以输入输出的,我们用另一种说法就是读和写,如果没有读,那么读就为空,如果没有写,那么写就为空,所以我们都可以把这些设备都看成有一个共同点,那就是都有读写方法。

Linux操作系统——文件详解,初学者必看:Linux操作系统入门,linux,运维,服务器,vim

这种方式的实现其实就是我们c++中面向对象的多态。文章来源地址https://www.toymoban.com/news/detail-792827.html

到了这里,关于Linux操作系统——文件详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux-初学者系列——篇幅4_系统运行相关命令

    上篇: Linux-初学者系列——篇幅3_操作界面获取帮助 一、关机重启注销命令 1、重启或者关机命令-shutdown 关闭和重启Linux系统的命令shutdown,系统在关闭重启之前会通知所有的登录用户,系统即将关闭重启时所有的新用户都不可以登录 语法格式: 常用参数: 序号 参数选项 功

    2024年02月05日
    浏览(53)
  • Linux文件系统(操作系统的文件管理)

    参考Linux内核源码版本------ linux-2.4.3 操作系统之下,进程是计算机系统 执行计算任务的基本单位 ,进程访问文件执行数据读写之前,操作系统会从外设获取相应的文件信息,在内存中建立 struct file 结构体对象来 描述和管理文件 ,进程借助 struct file 结构体提供的文件信息执行文件

    2024年02月05日
    浏览(51)
  • Linux操作系统详解

    Linux是一个开源的Unix-like操作系统。它是由芬兰计算机科学家Linus Torvalds于1991年首次发布。Linux以其稳定性,安全性和灵活性而受到欢迎,并被广泛用于服务器,超级计算机,嵌入式系统和许多其他平台。在某些领域,例如智能手机和平板电脑(主要是Android操作系统),Linu

    2024年02月12日
    浏览(36)
  • Linux——操作系统详解

    目录 一.操作系统的含义 1.操作系统是什么? 2.那么操作系统为什么要对软硬件资源进行管理呢?这样做的好处在哪里? 3.操作系统又是怎么进行管理的? 如何理解“先描述,再组织”? 二.总结: 示例1: 通过操作系统图映射银行管理 三.操作系统存在的意义 1.操作系统是什

    2024年02月06日
    浏览(34)
  • Linux操作系统(六):文件系统组件

    参考资料:阿秀的笔记 Linux 「一切皆文件」 不仅 普通的文件和目录 ,就连 块设备、管道、socket 等,也都是统一交给文件系统管理的。 如何唯一标识文件? 索引节点 inode ,记录了文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位

    2024年04月11日
    浏览(36)
  • Linux操作系统详解(最详细)

    一. linux操作系统的基本介绍 ​ Linux是一套免费使用和自由传播的类unix操作系统。那么什么是类unix操作系统呢?在1969年由unix之父Ken Thompson在ATT(American Telephone Telegraph, 美国电话电报公司,现在为美国第二大运营商,第一大运营商为 Verizon Wireless)的贝尔实验室主导研发的,当时

    2024年02月10日
    浏览(40)
  • Linux :: 内容过滤指令【3】:grep 指令【详解】:在指定文件中过滤搜索信息、(模糊)查找包含指定字符串的内容!(如:系统故障时,查看操作日志信息等情景)

    前言:本篇是 Linux 基本操作篇章的内容! 笔者使用的环境是基于腾讯云服务器:CentOS 7.6 64bit。 学习集: C++ 入门到入土!!!学习合集 Linux 从命令到网络再到内核!学习合集 注:find 指令常与 grep 指令在面试中被提及,需让你回答异同! 目录索引: 1. 基本语法、功能及使

    2024年02月09日
    浏览(57)
  • 操作系统安全:Linux安全审计,Linux日志详解

    「作者简介」: 2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等12个知识域的一百多个知识点,持续更新。 操作系统有4个

    2024年04月27日
    浏览(39)
  • 【Linux操作系统】探秘Linux奥秘:文件系统的管理与使用

    🌈个人主页: Sarapines Programmer 🔥 系列专栏: 《操作系统实验室》 🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。 目录 🪐1 初识Linux OS 🪐2 文件系统的管理与使用 🌍1. 实验目的 🌍2. 实验准备 🌍3. 实验内容 🌍4. 实验心得 📝总结

    2024年02月03日
    浏览(51)
  • VASP新手入门,对于VASP以及Linux系统初学者的福音~(附VASP简单结构优化的详细过程)

       其实好多朋友们对于突然被丢过来一个课题,去学习VASP是完全没有概念的,例如什么是VASP?VASP是一个什么样的软件?(好多的同学们在找我帮忙编译安装过VASP之后最有趣的一句话是“您好!请问VASP这个软件在哪里,我为什么找不到!”)如何使用VASP?用VASP到底去计算什

    2024年02月09日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包