CSAPP Note chap10
CSAPP 读书笔记系列chap10
chap 10 系统级IO
这一次说的是I/O,先说明大概,也就是 Unix I/O 和其他 I/O 的关系。
其结构如下:
图中底层是Unix I/O,通过系统调用来进行文件操作,
- Unix I/O,例如:
- 打开和关闭 :open, close
- 读和写:write, read
- 改变访问顺序:lseek
- 文件信息 stat
在这之上是 C 的标准 I/O 库,其为基于Unix I/O 实现的,
一些对应的函数为:
- C standard I/O :
- fopen, fdopen, fread, fwrite, fscanf, fprintf, sscanf, sprintf, fgets, fputs, fflush, fseek, fclose等
RIO 是专为本书开发的read和write的函数,也为基于Unix I/O 实现
- rio_readn,rio_writen, rio_readlineb 和 rio_readnb
Unix I/O
Unix I/O 是最通用最底层的 I/O 方法,其他的 I/O 包都是在 Unix I/O 的基础上进行构建的.
在 Linux 中,一切皆文件,文件实际上可以看做是字节的序列。
### 文件
为了区别Linux中不同文件的类型,会有一个 类型type 来进行区别:
普通文件:包含任意数据
- 二进制文件和文本文件对内核而言没有区别
- 文本文件: 只含ASCII或Unicode编码的文件
- 二进制文件: 所以其他文件
目录:相关一组文件的索引
- 套接字 Socket:和另一台机器上的进程通信的类型
其实还有一些比较特别的类型,不深入了解:
- 命名管道Named pipes(FIFOs)
- 符号链接Symbolic links
- 字符及设备Character and block devices
文件操作
打开文件open()
函数原型
#include <fcntl.h>
int open(char *name ,int flags, int perms);
参数的定义可以看K&R的第八章Unix系统接口或man 2 open
例如:
int fd; // 文件描述符 file descriptor
if ((fd = open("/etc/hosts", O_RDONLY)) < 0)
{
perror("open");
exit(1);
}
返回值是一个小的整型称为文件描述符(file descriptor),如果这个值等于 -1 则说明发生了错误。每个由 Linux shell 创建的进程都会默认打开三个文件(注意这里的文件概念):
- 0: standard input(stdin)
- 1: standard output(stdout)
- 2: standar erro