六、基础IO
1. C语言的文件接口
我们知道 文件 = 文件内容 + 文件属性 。即使是一个空文件,仍然会在磁盘中占据空间。那打开文件是什么意思呢?其实文件打开的意思就是:将文件从磁盘中加载到内存中。 文件跟程序一样,被操作系统使用内核数据结构给管理起来了,对文件的操作就转变为对文件的调度。
我们接下来熟悉和使用C语言中的文件接口。
参数:
“r”:只读方式打开文件,文件必须存在。
“w”:写入方式打开文件,如果文件存在,则清空文件内容;如果文件不存在,则创建新文件。
“a”:追加方式打开文件,如果文件存在,写入数据时定位到文件末尾;如果文件不存在,则创建新文件。
“rb”:以二进制只读方式打开文件。
“wb”:以二进制写入方式打开文件。
“ab”:以二进制追加方式打开文件。
不知道大家还记得Linux中的重定向符不,>输出重定向,<输入重定向,>>追加重定向。
重定向符和文件流非常相似,他俩肯定有莫大的关系。既然知道了写操作,我们接下来看看文件读取操作。
2. 系统文件I/O
我们从键盘接收输入,打印到显示器上,但键盘和显示器都是硬件资源,他们统统被操作系统所管理,我们的文件(进程)无法绕过操作系统打开这些资源,所以操作系统必须要提供一些接口来支持文件访问。
我们来用一用:
接下来看看怎么写和怎么关闭:
open系统调用接口传递标志位(本质是宏)时,还有其他的标志位。
我们系统调用接口中都需要 fd 这个参数,这个参数是文件标识符,确定文件的参数。在操作系统内部,进程PCB中存储着一个结构体指针,指向一个文件描述符表,这个表是一个结构体指针数组,内部存的是文件结构体指针,分别指向不同的打开的文件。而这个 fd 就是这个文件表结构体的下标,确定文件。
一般来说,fd = 0 是标准输入文件流(键盘文件),1 是标准输出文件流(显示器文件), 2 是标准错误文件流(显示器文件)。
fd的分配规则:最小的没有被使用的数组下标,会被分配给最新打开的文件。 所以我们可以:close(1),即关闭stdout流,然后新打开的文件的fd就是1,但是输出函数并不知道,向显示器打印的字符串统统转变成向文件内写入。就实现了重定向的功能。
这里 dup2 函数可以方便实现重定向的功能。