打开的磁盘文件的FILE结构体及buffer使用的是kernel的地址空间

来源:互联网 发布:cctv1在线直播软件 编辑:程序博客网 时间:2024/05/16 07:21

声明:本人正在研读UNIX环境高级编程,相关博文为学习心得,观点可能会有错误,若那位大神发现错误,请留言指正,不胜感激。

如下代码执行时,内核地址空间(3-4G)和用户地址空间(0-3G)的使用情况分析:

void main()

{

    FILE * fp = null ;

    fp = fopen("temp.out","rw") ;

    . . . 

    fclose(fp) ;

}

   对于standard I/O操作,当某进程调用fopen打开一个存在的磁盘文件,将会创建一个FILE文件结构体,用来描述被打开文件的状态。

同时,由于standard I/O为buffered I/O,因此,需要为其创建一个缓冲区。由于打开文件时,使用了预读机制,因此,打开一个文件

时,已经将文件中的一个数量的字节读到了此缓冲区中。若对此文件进行追加写操作,则追加的字节,首先会缓存到此缓存区中。由

于buffered I/O对于磁盘文件的缓存方式是fully buffered,因此,只有当此缓存区满时,才将缓存区中的字节同步到磁盘文件。

    对于上面所说的FILE结构体和缓存区,它们占用的是内核的地址空间(3-4G),而不是调用fopen函数的进程的地址空间。不是使用

进程的heap。对于上述代码,使用到进程地址空间的自有文件指针fp。此变量为自动变量,使用进程的stack空间。

0 0