前言
如果open打开失败的话(比如文件不存在就会导致失败),open啥也不会干就直接返回了。但是如果open将文件打开成功的话,open具体做了哪些事情呢?
open成功后行为
记录打开文件的信息
①程序运行起来后就是一个进程了,OS会创建一个task_struct的结构体,记录进程运行时的各种信息,比如所打开文件的相关信息。
②open将文件成功打开后,在task_struct中又会创建一些结构体(数据结构),用于记录当前进程目前所开文件的信息,后续所有的文件操作,都需要依赖于这些信息,其中就包括指向打开文件的文件描述符。
申请内存空间
open函数会申请一段内存空间(内核缓存),后续读写文件时,用于临时缓存读写文件时的数据。
什么是缓存?
就是开辟的一段内存空间,比如char buf[100],这就是一段100字节的缓存空间,用于临时存放中转的数据。
为什么叫内核缓存?
open是OS所提供的系统函数,属于OS内核的一部分,所以open函数所开辟的缓存空间,就是内核缓存。
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h> 5 #include <unistd.h> 6 7 int main(void) 8 { 9 int fd = 0; 10 11 fd = open("./file.txt", O_RDWR); 12 if(-1 == fd) 13 { 14 printf("open fail\n"); 15 return 0; 16 } 17 else 18 { 19 printf("open ok\n"); 20 } 21 22 char buf1[] = "hello world"; 23 write(fd, (void *)buf1, 11); 24 25 lseek(fd, 0, SEEK_SET); 26 27 char buf2[30] = {0}; 28 read(fd, buf2, sizeof(buf2)); 29 30 printf("buf2 = %s\n", buf2); 31 32 close(fd); 33 34 return 0; 35 }
例子程序中,我定义了buf1和buf2这两个数组,这两个数组是我自己的应用程序定义的,因此就叫应用缓存。
open为什么要开内核缓存空间?
内存读写速度 > 磁盘读写速度的,有了在内存中开辟的内核缓存后,上层读写数据时,会直接读写缓存,速度会很快,至于缓存与磁盘上文件数据的交换,就留给下层去做,这样可以节省上层操作的时间。
注意:open时只是开辟了内核缓存空间,里面并没有数据,只有当进行读写数据时,才会缓存读写的数据。
读写时,缓存间数据的流动是怎样的?