CSAPP-----系统级IO

本文详细介绍了Unix I/O的概念,强调理解它对于深入学习计算机系统的重要性。Unix视所有设备为文件,统一了I/O操作。内容涵盖文件的打开、关闭、读写、元数据获取、目录读取、文件共享、IO重定向和标准I/O等。重点讨论了Unix I/O的统一接口、文件类型、描述符管理以及读写操作,同时建议在网络编程中使用RIO函数以确保健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章目录:

1、Unix I/O

2、文件

3、打开和关闭文件

4、读和写文件

5、用RIO包健壮的读写

6、读取文件元数据

7、读取目录内容

8、共享文件    

9、IO重定向

10、标准I/O

11、具体使用情况

12、小结 


本系列文章的观点和图片均来自《深入理解计算机系统第 3 版》仅作为学习使用

        输入输出(I/O)是主存和外部设备(磁盘、终端、网络)之间复制数据的过程。输入操作是从I/O设备复制数据到主存,输出操作是从主存到I/O设备。所有语言的运行时系统都提供执行I/O的较高级别的工具,例如C中的printf和scanf带有缓冲区的I/O函数,C++中重载的<<(输入)和>>(输出),linux中使用内核提供的系统级I/O函数来实现较高级别的I/O函数。虽然高级别的I/O函数工作良好,但是理解UNIX 的I/O也是很有必要的。

        *了解Unix I/O可以帮助你理解其他系统概念。I/O是系统操作不可或缺的一部分。I/O和系统的其他概念之间都是相互依赖的,比如I/O在进程的创建和执行中扮演重要角色,反过来进程中间又在不同进程间文件共享扮演者关键角色。

        *有时候除了Unix别无选择。在某些时候,高级I/O函数不太合适,比如标准I/O库没有读取文件元数据的方式(文件大小、创建时间),另外I/O库还存在一些问题,使用它来网络编程非常冒险。

1、Unix I/O

        在linux中所有的I/O设备(网络、磁盘、终端)都被模型化为文件,所有的输入输出都当作相应文件的读写来执行,这种将设备映射为文件的方式,允许linux内核引出一个简单的、低级的接口称为Unix I/O,使得所有的输入和输出都能以一种统一并且一致的方式来执行。

        *打开文件。一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备,内核返回一个小的非负数,叫做描述符,它在后续对此文件的操作中标识这个文件,内核记录有关这个打开文件的所有信息,应用程序只需要记住这个描述符。

        *linux shell创建的每个进程开始都有三个打开的文件:标准输入(描述符为0),标准输出(描述符1)和标准错误输出(描述符2)。头文件<unistd.h>定义了常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,用来代替描述符值。

        *改变当前文件位置,对于每一个打开的文件,内核保持一个文件位置k,初试为0,这个文件位置就是文件从头开始的字节偏移量,应用程序可以通过执行seek操作显示的设置文件的当前位置为k。

      *读写文件。一个读操作就是从文件复制n>0个字节到内存,从当前文件位置k开始,然后将k增加到k+n,给定一个大小为m的字节文件,当k>=m时执行读操作会触发一个称为end-of-file(EOF)的条件,应用程序能检测到这个条件,在文件结尾处并没有明确的EOF符号。类似的,写操作就是从内存复制n个字节到一个文件。从当前位置k开始,然后更新k。

       *关闭文件。当应用完成了对文件的访问之后,它就通知内核关闭这个文件,作为响应,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。无论一个进程因为何种原因终止时,内核都会关闭所有的打开的文件,并释放他们的内存资源。

2、文件

        每个linux文件都有一个类型来表明它在系统中的角色。

        *普通文件,包含任意数据,应用程序常常要区分文本文件和二进制文件,文本文件只是含有ASCII或Unicode字符的普通文件,二进制文件是所有其他文件,对内核而言,这两种文件没有区别。linux文本文件包含一个文本行序列,其中一行是一个字符序列,以一个新行符(“\n”)结束,新行符和ASCII的换行符是一样的,其数字值为0x0a。

        *目录是包含一组链接的文件,其中每个链接都将一个文件名映射到一个文件,这个文件可能是另一个目录,每个目录至少含有两个条目,“.”是该目录自身的链接,“..”是目录层次结构中父目录的链接。、

        *套接字是用来与另一个进程跨网络通信的文件。

        其他文件类型包含命名通道、符号链接、以及字符和块设备。

        linux内核将所有文件都组成一个目录层次结构,由名为/的根目录确定。系统中每个目录都是根目录的直接或间接的后代。如下图:
       

        作为上下文的一部分,每个进程都有一个当前的工作目录来确定其在目录层次结构的当前位置,可以用cd命令来修改shell中的当前目录。

        目录层次结构中位置用路径名来指定,路径名是一个字符串,包括一个可选斜杠,其后紧跟一系列的文件名,文件名之间用斜杠分隔,路径名有两种形式:

        *绝对路径名以一个斜杠开始,表示从根节点开始的路径。

        *相对路径名以文件名开始,表示从当前目录开始的路径。

3、打开和关闭文件

        进程是通过调用open函数来打开一个已存在的文件或创建一个新文件。

       open原型(https://blog.youkuaiyun.com/zl6481033/article/details/85285697#3%E3%80%81open%E5%87%BD%E6%95%B0

        

        open将filename转换成一个文件描述符,并返回描述符数字,返回的描述符总是在进程中没

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值