CSAPP(第三版)第十章程系统级I/O学习笔记
了解Unix I/O将帮助你理解其他的系统概念。
有时你除了使用这个别无选择
Unix I/O
所有的输入和输出都能以一种同意且一致的方式来执行:
- 打开文件。
- Linux shell 创建的每个进程开始时都有三个打开的文件:标准输入,标准输出和标准错误。
- 改变当前的文件位置。
- 读写文件。
- 关闭文件。
文件
每个Linux文件都有一个类型来表明他在系统的角色:
- 普通文件包含任意数据。
- 目录是包含一组链接的文件,其中每个链接都将一个文件名映射到一个文件,这个文件可能是另一个目录。
- 套接字使用啦与另一个进程进行跨网络通信的文件。
打开和关闭文件
进程是通过调用open函数来打开一个已存在的文件或者创建一个新文件的的:
open函数将filename转换为一个文件描述符,并且返回描述符数字。返回的描述符总是在进程中当前没有打开的最小描述符。
flags参数指明了进程打算如何访问这个文件:
- O_RDONLY:只读。
- O_WRONLY:只写。
- O_RDWD:可读可写。
falgs参数也可以是一个或者更对为掩码的或,为写提供给一些额外的指示: - O_CREAT:如果文件不存在,就厂家一个它的新的截断的空文件。
- O_TRUNC:如果文件已经存在,就截断它。
- O_APPEND:在每次写操作前,设置文件位置到文件的结尾处。
读和写文件
应用程序是通过分别调用read和write函数来执行输入和输出的。
read函数从描述符为fd的当前文件位置复制最多n个字节到内存位置buf。返回值-1表示一个错误,而返回值0表示EOF。否则,返回值表示的是实际传送的字节数量。
write函数从内存位置buf复制至多n个字节到描述符fd的当前文件位置。
在某些情况下,read和write传送的字节比因公程序要求的要少。这些不足值不表示有错误。出现这样的原因有:
- 读时遇到EOF。
- 从冲断读文本行。
- 读和写王拓套接字。
用RIO包健壮的读写
RIO提供了两类不同的函数:
- 无缓冲的输入输出函数。
- 带缓冲的输入输出函数。
读写文件元数据
应用程序能够通过调用stat和fstat函数,检索到关于文件的信息(也称为文件的元数据)。
读取目录内容
应用程序可以用reddir系列函数来读取目录的内容。
函数opendir以路径名为参数,返回指向目录流的指针。
函数closedir关闭流并释放其所有的资源。
共享文件
内核用三个相关的数据结构来表示打开的文件:
- 描述符表。
- 文件表。
- v-node表。
I/O重定向
Linux shell提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。
标准I/O
C语言定义了一组高级输入输出函数,称为标准I/O库,为程序员提供了Unix I/O的较高级别的替代。
G1:只要有可能就使用标准I/O.
G2:不要使用scanf或rio_readlineb来读二进制文件。
G3:对网络套接字的I/O使用RIO函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现