FILE结构体

FILE结构体用于文件操作,定义在C语言的stdio.h头文件中

我们通常所写的FILE *fp; 定义了一个指向该结构体的指针,通过fopen()返回一个指向要打开(或写入、创建)文件的指针

结构体中的成员_file实际上是一个描述符,用于进入打开文件表索引的指针

下图是我在VS2013中截的图

#ifndef _FILE_DEFINEDstruct _iobuf {

    char *_ptr;      //文件输入的下一个位置
    int _cnt;        //当前缓冲区的相对位置
    char *_base;     //指基础位置(即是文件的其始位置) 
    int _flag;       //文件标志
    int _file;       //文件的有效性验证
    int _charbuf;    //检查缓冲区状况,如果无缓冲区则不读取
    int _bufsiz;     //文件大小
    char *_tmpfname; //临时文件名

        };typedef struct _iobuf FILE;#define _FILE_DEFINED#endif

C语言通过FILE结构可以间接操作文件控制块(FCB)

文件是存放在物理磁盘上的,包括FCB和数据块

文件控制块中存放的在上面的图中;

数据块用来存储实际的内容。

系统维护了两张表,一张是系统级打开文件表,一张是进程级打开文件表。

系统级打开文件表 复制了文件控制块的信息等;

进程级打开文件表 保存了指向系统级文件表的指针及其他信息。

系统级文件表每一项都保存一个计数器(该文件打开的次数)。当我们打开一个文件时,系统首先查看该文件是否已在系统级文件表中,如果已经存在就把该项的计数器加一,如果不在则创建该项信息。

当我们关闭一个文件时,该文件对应的计数器会减1,当减到0时,系统将系统级文件表中的项删除。

进程打开一个文件时,会在进程级文件表中添加一项。每项的信息包括当前文件偏移量(读写文件的位置)、存取权限、一个指向系统级文件表中对应文件项的指针。

FILE结构体中的_file成员应该是指向进程级打开文件表,然后,通过进程级打开文件表可以找到系统级打开文件表,进而可以通过FCB操作物理磁盘上面的文件。系统级文件表中的每一项通过文件描述符(一个非负整数)来标识。

时间: 2024-10-25 19:18:13

FILE结构体的相关文章

file结构体中private_data指针的疑惑【转】

本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html hi all and barry, 最近在学习字符设备驱动,不太明白private_data在字符驱动中的作用,我们在 驱动中添加一个设备结构体,然后定义了这个结构体的全局指针变量,接着我们就能在 驱动程序中使用这个指针了.我看到很多驱动程序中都把结构体指针付给private_data, 然后对private_data操作. 为什么要使用private_data,难道仅仅是避免使

Linux--struct file结构体

struct file(file结构体): struct file结构体定义在include/linux/fs.h中定义.文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的 struct file. 它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数.在文件的所有实例都关闭后,内核释放这个数据结构.在内核创建和驱动源码中, struct file的指针通常被命名为file或filp.其有两个非常重要的字段:文件描述符和缓冲区.  文件描述符fd: fd只是一个

FILE 结构体的定义,inode ,软链接和硬链接的理解

一.FILE结构体: C将每个文件简单地作为顺序字节流.每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件的关系. 在开始执行程序的时候,将自动打开3个文件和相关的流:标准输入流.标准输出流和标准错误.流提供了文件和程序的通信通道.例如,标准输入流使得程序可以从键盘读取数据,而标准输出流使得程序可以在屏幕上输出数据.打开一个文件将返回指向FILE结构(在stdio.h中定义)的指针,它包含用于处理文件的信息,也就

file 结构体

FILE结构体 VC6.0中: #ifndef _FILE_DEFINED struct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前缓冲区的相对位置 char *_base; //指基础位置(即是文件的其始位置) int _flag; //文件标志 int _file; //文件的有效性验证             这个文件记录可以在FCB表中找到 int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取 int _bufsiz;

FILE 结构体及缓冲区

FILE:为C语言中包含在stdio.h中的对文件进行操作的一个结构体,该结构体包含有文件名.文件状态和文件当前位置等信息. 不同的编译器stdio头文件对FILE的定义略有差异,标准C中如下定义: struct _iobuf {     char *_ptr; //下一个要被读取的字符的地址     int   _cnt; //剩余的字符,如果是输入缓冲区,那么就表示缓冲区中还有多少字符未被读取     char *_base;//缓冲区基地址     int   _flag;//读写状态标志

Linux_Struct file()结构体

struct file结构体定义在/linux/include/linux/fs.h(Linux 2.6.11内核)中,其原型是:struct file {        /*         * fu_list becomes invalid after file_free is called and queued via         * fu_rcuhead for RCU freeing         */        union {                struct l

Linux字符设备中的两个重要结构体(file、inode)

对于Linux系统中,一般字符设备和驱动之间的函数调用关系如下图所示 上图描述了用户空间应用程序通过系统调用来调用程序的过程.一般而言在驱动程序的设计中,会关系 struct file 和 struct inode 这两个结构体. 用户空间使用open()系统调用函数打开一个字符设备时( int fd = open("dev/demo", O_RDWR) )大致有以下过程: 在虚拟文件系统VFS中的查找对应与字符设备对应 struct inode节点 遍历字符设备列表(chardevs

3. file、inode结构体及chardevs数组等相关知识解析

https://blog.csdn.net/zqixiao_09/article/details/50850004 下图描述了Linux中虚拟文件系统,一般的设备文件与设备驱动程序间的函数调用关系 上图展现了一个应用程序调用字符设备驱动的过程,在设备驱动程序的设计中,一般而言,会关系file和inode这两个结构体. 用户空间使用open()函数打开一个字符设备fd = open("/dev/hello", o_READ);这一函数会调用两个数据结构struct inode{}&

Linux struct file 结构

struct file结构体定义在/linux/include/linux/fs.h(Linux 2.6.11内核)中,其原型是:struct file {        /*         * fu_list becomes invalid after file_free is called and queued via         * fu_rcuhead for RCU freeing         */        union {                struct l