1 2 3 4

CSAPP(第三版)第十章程系统级I/O学习笔记

了解Unix I/O将帮助你理解其他的系统概念。
有时你除了使用这个别无选择

Unix I/O

所有的输入和输出都能以一种同意且一致的方式来执行:

  • 打开文件。
  • Linux shell 创建的每个进程开始时都有三个打开的文件:标准输入,标准输出和标准错误。
  • 改变当前的文件位置。
  • 读写文件。
  • 关闭文件。

文件

每个Linux文件都有一个类型来表明他在系统的角色:

  • 普通文件包含任意数据。
  • 目录是包含一组链接的文件,其中每个链接都将一个文件名映射到一个文件,这个文件可能是另一个目录。
  • 套接字使用啦与另一个进程进行跨网络通信的文件。

打开和关闭文件

进程是通过调用open函数来打开一个已存在的文件或者创建一个新文件的的:
image
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函数,检索到关于文件的信息(也称为文件的元数据)。
image

读取目录内容

应用程序可以用reddir系列函数来读取目录的内容。
image
函数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函数。

posted @ 2022-09-28 15:43  无序  阅读(73)  评论(0编辑  收藏  举报