声明:本人正在研读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空间。