系统IO的特点
- 系统IO的操作的对象是文件描述符。标准IO的对象是文件指针。
- 系统IO并不带缓冲,因此每次对系统IO的操作都视为数据与内核相交互。
- 某些场合下,只能使用系统IO。例如:处理socket的时候,只能使用系统IO,标准IO不行。
Linux中的文件类型简介
可以在Linux系统中,使用ls -l
进行查看各种文件类型
- 目录 (d)
- 普通文件 (-)
- 字符设备 (c)
- 块设备 (b)
- 符号链接文件 (l)
- 本地预套接字 (s)
- 管道 (p)
如何使用系统IO存储文件
- Open()函数的使用
函数简介
首先了解一下这个函数的使用方法:
man 2 open
值得我们注意的是,open函数的返回值:
open函数会返回一个文件描述符,那么如果文件打开成功的话,会返回一个大于0的值,如果打开失败则返回一个-1值。
描述符是什么
那么,这个值代表什么意思呢?(下面引用一张图)
- 假如我们要使用Open函数打开一个a.txt的文件,那么在a.txt文件创建的时候,在内核空间就已经使用结构体中的其中一个指针指向这个a.txt。
- 当我们使用Open函数打开a.txt的时候,内核空间会根据open传递过来文件的名字,在结构体中找到指向a.txt的指针,那么在结构体中,指针也有下标的,这个i下标的指针就是指向a.txt的指针,当找到a.txt后,内核空间会把i返回给open,这个i 就是描述符。
open函数中的flag:
flags | 作用 |
---|---|
O_RDONLY | 以只读的方式打开文件 |
O_WRONLY | 以只写的方式打开文件 |
O_RDWR | 读写方式打开文件 |
O_CREAT | 如果文件不存在,则创建该文件 |
O_EXCL | 如果使用O_CREAT选项且文件存在,则返回错误信息 |
O_NOCTTY | 如果文件为终端,那么终端不可以作为调用Open()系统调用的那个进程的控制终端 |
O_TRUNC | 如文件已经存在,则删除文件中原有的数据 |
O_APPEND | 以追加的方式打开文件 |
代码实现
为什么fd输出为3呢?