9.1 Linux_I/O_基本知识
文件类型
一切I/O皆文件,文件就是存放在磁盘上面的有序数据的集合。
文件类型:
- 常规文件 r :就是普通文件
- 目录文件 d :就是目录,是一个索引
- 字符设备文件 c :键盘、鼠标
- 块设备文件 b :U盘、磁盘,以块的方式进行存储的设备
- 管道文件 p :
- 套接字文件 s :
- 符号链接文件 l :就是快捷方式
系统调用与库函数
系统调用就是操作系统给我们提供的接口,库函数是在系统调用之上封装的函数。
系统调用与库函数的层次关系如下:
库函数存在的意义:
库函数可以让代码更兼容,方便代码的移植。库函数就相当于一个翻译可以将同一句话翻译为不同操作系统下对应的系统调用。
尽管我们可以直接通过系统调用来实现功能,但每个操作系统提供的接口不一样,所以在移植到其他操作系统时,每次都需要重新编写代码实现同样的功能;而使用库函数后,因为库函数的接口是一样的,因此移植之后就不需要对代码进行修改(库函数是已经写好的代码)。
标准I/O
标准I/O由ANSI C标准定义,主流操作系统上都实现了C库(这就是库函数)
标准I/O通过缓冲机制减少系统调用,实现更高的效率。
流的概念:
在C语言中定义了一个结构体FILE,这个结构体用于存放标准I/O打开的文件相关信息。FILE就是流(stream),就是把数据当成水流一样从一个地方传到另一个地方。
流分为文本流和二进制流。
流的缓冲类型:
无缓冲:直接与磁盘进行数据交互,直接写磁盘,直接读磁盘。流不进行缓冲。
全缓冲:内存中有一个空间叫做缓冲区,用于与数据进行交互。缓冲区满之后,一次性发给磁盘。
行缓冲:当输入/输出中出现了换行符时,就把缓冲区中的数据发给磁盘,这时缓冲区不一定写满
三个标准I/O:
名称 | 文件描述符 | 结构体(流) | |
标准输入流 | 0 | STDIN_FILENO | stdin |
标准输出流 | 1 | STDOUT_FILENO | stdout |
标准错误流 | 2 | STDERR_FILENO | stderr |
全缓冲与行缓冲实验:
数据输出的情况有:
- 程序结束将缓冲区全部数据输出
- 全缓冲时,缓冲区满,将全部数据输出。缓冲区的大小为1KB=1024Byte
- 行缓冲时,输入有换行'\n',将全部数据输出
- 手动刷新缓冲区时,将全部数据输出
程序结束输出实验如下:
全缓冲区实验如下:
行缓冲实验如下:
文件I/O
文件I/O又叫系统I/O、系统调用,是系统提供的一个接口,对于不同的系统,提供的接口是不一样的。文件I/O不提供缓冲机制,每次读写都是直接操作磁盘空间。
什么是POSIX:
POSIX是一个可移植操作系统接口的标准,它定义了一组函数。它也是一种文件I/O
什么是文件描述符:
每个打开的文件都会有一个对应的文件描述符(fd),它是一个非负整数。一个程序最多可以打开1024个文件,文件描述符从0开始分配,其中0,1,2分别代表标准输入、标准输出、标准错误。