初级文件IO——open打开文件成功后行为分析

前言

如果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 }
View Code

例子程序中,我定义了buf1和buf2这两个数组,这两个数组是我自己的应用程序定义的,因此就叫应用缓存。

open为什么要开内核缓存空间?

内存读写速度 > 磁盘读写速度的,有了在内存中开辟的内核缓存后,上层读写数据时,会直接读写缓存,速度会很快,至于缓存与磁盘上文件数据的交换,就留给下层去做,这样可以节省上层操作的时间。

注意:open时只是开辟了内核缓存空间,里面并没有数据,只有当进行读写数据时,才会缓存读写的数据。

读写时,缓存间数据的流动是怎样的?

 

猜你喜欢

转载自www.cnblogs.com/kelamoyujuzhen/p/9638710.html