文件IO学习笔记第一章:预备篇

      大家好,我是小智!

一、计算机的组成部分

硬件系统

      计算机的硬件主要是由五部分组成:控制器、运算器、存储器、输入设备、输出设备。其中运算器和控制器的总称是中央处理器(CPU),指的是计算机中对信息进行高速运算处理的主要部件。

      存储器则是用来存储程序、数据和文件,一般是由快速的内部存储器(容量可达数百兆字节,甚至数G字节)和慢速的外部存储器(容量可达数十G或数百G以上)组成,比如计算机中的内存条和固态硬件就属于存储器。

image

      输入设备与输出设备就是用于实现人机交互的信息转换器,由计算机的输入输出控制系统负责管理外部设备与主存储器之间的信息交换,常用的输入设备主要有键盘以及鼠标,输出设备则是显示器、打印机以及其他可连接到计算机上的I/O设备。

软件系统

      如果计算机只有硬件系统,那么计算机是无法正常工作的,因为计算机是由基本的电子元件组成的,而电子元件的状态是需要由软件来控制的,所以计算机必须要搭载软件系统,计算机的软件系统与硬件系统是互相依赖的。

      计算机的软件系统一般由两部分组成:系统软件、应用软件。系统软件指的是计算机中的操作系统以及硬件驱动程序等,应用软件指的是用户可以使用的各种程序设计语言以及利用程序设计语言设计的应用程序的集合。

文件系统

      计算机的系统软件和应用软件其实都是大量的程序和数据组成的,也就是说两者都需要存储在计算机的存储器中,这些程序和数据以什么样的格式存储到存储器中就由文件系统决定。

      大家可以把文件系统理解为是一种“标准”或者“格式”,只要遵循这套标准就可以正确的访问存储在磁盘中的数据。

      当然,标准的制定则是至关重要,但是由于技术原因或者商业利益考虑,导致现在文件系统没有办法统一。所以目前存在多种文件系统,常见的有FAT32、NTFS、ext4......,比如电脑的本地磁盘的文件系统就是NTFS格式。

image

      当大家有的时候发现磁盘出现某些扇区损坏导致数据丢失时,就可以对磁盘进行格式化,在格式化磁盘的时候就可以选择指定的文件系统类型。

      Linux系统也支持多种文件系统类型,可以在Linux系统根目录的/proc目录下查阅filesystems

image

      计算机中搭载的Linux操作系统就属于系统软件,操作系统的作用是用来连接应用软件和底层硬件,因为涉及到Linux内核的安全管理机制,所以用户空间是没有办法直接访问硬件设备的。

image

      那么用户必须要通过Linux内核提供的相关函数接口才能实现硬件的控制,这样用户也不需要关心硬件应该如何控制,只需要把参数提交给内核,然后由内核把控制参数传递给硬件设备,从而让内核控制硬件设备完成相关动作。

      也正因如此,用户需要先利用程序设计语言设计出源文件(xxx.c),然后操作系统内核需要从磁盘中访问源文件,再通过编译器把源文件编译生成可执行文件,最后内核再访问存储在磁盘中的可执行文件,从而把控制硬件的参数读取出来。

      所以访问磁盘中的文件也是操作系统要做的工作之一。所以操作系统和文件系统可以理解为一种“合作”关系,文件系统指定了读写文件的标准,而操作系统会按照这套标准去完成访问文件的动作。

三、Linux系统的目录

根文件系统说明

      需要注意:Linux系统是离不开文件系统的,在Linux内核启动之后首先搭载的就是根文件系统rootfs,根文件系统rootfs本质就是文件系统,只不过是Linux内核挂载的第一个文件系统。而Linux内核源码是存储在文件系统中,所以在linux系统启动的过程中启动引导程序uboot会加载内核并利用内核挂载根文件系统。

问题:请简述Linux系统的启动过程(重点)

image

      根文件系统被挂载之后,一些服务程序和一些脚本文件才可以存储在文件系统中,其他的文件系统才可以被挂载。

      根文件系统会提供一些服务:比如根文件系统会提供一个根目录(存储文件和目录)、提供一个shell终端(用户才可以输入命令)、根文件系统会存储应用程序。总而言之,Linux内核离开根文件系统是无法正常工作的。

image

      Linux系统的所有程序和数据都是以“文件”的形式存储在文件系统中,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。这种机制有利于用户和操作系统的交互,这也是Linux系统“一切皆文件”的原因。

      其实就是借鉴了Unix系统的设计风格,体现了面向对象的设计思想,把脚本、文档、硬件设备等都抽象为文件对象,再通过统一的POSIX操作接口对文件进行操作,简化了操作难度。

目录的结构分析

      在 Linux 操作系统中,所有的文件和目录都被组织成以一个根节点“/”开始的倒置的树状结构。如下图:

image

      文件系统的最顶层是由根目录开始的,系统使用“/”来表示根目录,在根目录之下的既可以是目录(目录就相当于 Windows 中的文件夹),也可以是文件,而每一个目录中又可以包含(子)目录或文件。如此反复就可以构成一个庞大的文件系统。

      使用这种树状、具有层次的文件结构主要目的是方便文件系统的管理和维护,想象一下,如果所有的文件都放在一个目录下,其文件系统的管理和维护将变成一场噩梦。

      同样,为了方便观察Linux系统的目录结构,所以Linux内核也提供了一个shell命令:tree,该命令可以以树状结构打印出目录的层次,当然,tree命令需要在Linux系统中提前安装。

      在shell终端中输入命令(以Ubuntu为例):

sudo  apt-get  install  tree

Linux的文件类型

      由于程序和数据在Linux系统中都是以文件的形式存在,那不同格式的数据所对应的文件类型也各不相同,在Linux系统下可以把文件的类型分为以下七种:

  1. 普通文件:存在于外部存储器中,用于存储普通数据。
  2. 目录文件:用于存放目录项,是文件系统管理的重要文件类型。
  3. 管道文件:一种用于进程间通信的特殊文件,也称为命名管道FIFO。
  4. 套接字文件:一种用于网络间通信的特殊文件。
  5. 链接文件:用于间接访问另外一个目标文件,相当于windows快捷方式。
  6. 字符设备文件:字符设备在应用层的访问接口。
  7. 块设备文件:块设备在应用层的访问接口。
gec@ubuntu:~$ ls  -l
-rw-r--r-- 1 gec gec  345  Sep  12:38 a.zip			//-(regular)		普通文件
drwxr-xr-x 2 gec gec 1024  Sep  12:38 dir/	    	        //d(directory)	目录文件
prw-r--r-- 1 gec gec    0  Sep  12:38 pipe 			//p(pipe)		管道文件
srw-r--r-- 1 gec gec    0  Sep  12:38 socket			//s(socket)		套接字文件
lrw-r--r-- 1 gec gec    4  Sep  12:38 link -> a.zip	        //l(link)		链接文件
crw-r--r-- 1 gec gec  1, 3  Sep  12:38 character		//c(character)	字符设备文件
brw-r--r-- 1 gec gec  5, 1  Sep  12:38 block			//b(block)		块设备文件

文件操作接口说明

      上面提到数据都是以文件的形式存储在Linux系统中,并且Linux系统为了简化不同类型文件的操作流程,在设计访问接口时也遵循POSIX标准,而POSIX标准就是对不同操作系统的访问接口做出统一的规范,目的是提高程序的兼容性和可移植性。

      大家经常使用的C语言同样具有语法标准,并且C语言标准在发布的时候也会发布对应的库函数提供给用户。这些库函数也同样遵循POSIX标准进行设计,而遵循POSIX标准设计出来的函数的集合也被称为标准库,比如大家使用的标准C库中提供了标准的输入输出函数,这些函数在Linux系统可以使用,同样也可以在Windows系统中使用。用户可以根据标准输入输出头文件<stdio.h>中的函数声明进行调用,Linux系统下该头文件路径为 /user/include。

image

      另外,由于任何一种操作系统都会有访问磁盘文件的需求,所以POSIX标准中同样对访问文件的输入输出接口做出了约束,这些访问文件的函数接口在C语言标准中都有具体的描述。

      标准C库中关于文件输入输出的函数接口一般被称为标准IO,访问文件常用的标准IO函数有fopen()、fread()、fwrite()、fclose()、fgetc()、fputc()、fgets()、fputs()、fprintf()、fscanf()等。具体内容可以看C标准或man手册。

image

posted @ 2025-05-16 10:45  努力赚钱的小智  阅读(116)  评论(0)    收藏  举报