文件标识符、重定向、缓冲区
想要深入理解文件相关操作,就必须从底层操作系统上有一个深入的理解!!!
从语言层面来说:C语言会默认打开三个输入输出流 stdin stdout stderr 标准输入-键盘 标准输出-显示器 标准错误-显示器 这两个显示器的区别是什么呢?? 标准输出可以重定向的到文件,标准错误不能重定向到文件 同样的C++会打开 cin , cout , cerr
那么这三个标准流指的是什么呢?
可以看出三个的文件类型都是FILE*类型的结构,那么这个FILE从本质上又是什么呢?答案是结构体,具体又是怎么说呢,我们等会在解释这个概念。
在引出一条新的老话,一切皆文件,向文件中或者是硬件设备中写入,其实都是指的向文件中写入,最终访问的都是硬件:显示器、键盘、文件(就是存在于磁盘之中的)。那么在操作系统上又是怎么完成这个操作流程呢?看下图
那么文件操作系统提供的接口又是什么样
操作系统上接口提供的open函数就是上面的,其中语言层面的就是将这些接口进行封装调用实现。
接下来我们关心一些返回值int类型,打开文件的返回值是int类型???惊了这不是
此时这个东西呗赋予了一个新的名词, 文件描述符fd 在创建了几个文件之后,发现他们的返回值是3,4,5,6??这又是什么意思呢?? 连续但是0 1 2 呢??stdin、stdout、stderr???这个意思?
为了解决这个文件描述符问题,我们在看下面的这个流程图
六字真言 先描述,在组织 这个又是怎么操作的呢?
文件描述符的分配规则,就是给新文件分配fd,是从fd_arr[]中找到一个最小的,没有被使用的
解决了文件描述符这个概念,我们在来解释一下一切皆文件
在引出一个名词,重定向
输出重定向 - 本质就是将本来应该显示在显示器上的,被显示到文件内部,
是怎么实现这个输出重定向的呢?
就是将log.txt中的地址复制到1所对应的地方,就能够完成输出重定向
可以怎样调用输出重定向呢
使用 dup2系统调用
执行exec*的程序替换时,会不会影响我们曾经打开的文件 不会的
最后一个问题??缓冲区的问题。