目录Linux–文件描述符、文件指针、索引节点
一、Linux —— 文件描述符1、文件描述符 Fd2、系统级的文件描述符表3、文件系统的inode表二、文件指针 *FILE三、索引节点 Inode1、Inode特殊作用四、拓展
1、磁盘结构
Linux–文件描述符、文件指针、索引节点
一、Linux —— 文件描述符
1、文件描述符 Fd
当进程打开文件或创建新文件时,内核会返回一个文件描述符(非负整数),用来指向被打开的文件,所有执行I/O操作的系统调用(read、write)都会通过文件描述符。
文件描述符可以理解为进程文件描述表这个表的索引,或者把文件描述表看做一个数组的话,文件描述符可以看做是数组的下标。当需要进行I/O操作的时候,会传入fd作为参数,先从进程文件描述符表查找该fd对应的那个条目,取出对应的那个已经打开的文件的句柄,根据文件句柄指向,去系统fd表中查找到该文件指向的inode,从而定位到该文件的真正位置,从而进行I/O操作。
特点:
每个文件描述符会与一个打开的文件相对应
不同的文件描述符也可能指向同一个文件
相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开
相关的三张表:
进程级的文件描述符表
struct task_struct {
//…
struct files_struct *files // 进程级别的文件描述符表
//…
};
2、系统级的文件描述符表
内核对系统所有打开的文件维护了一个打开文件表,表中每一项称为打开文件句柄,一个打开文件句柄描述了一个打开文件的全部信息
当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改)
打开文件时所使用的状态标识(即,open()的flags参数)
文件访问模式(如调用open()时所设置的只读模式、只写模式或读写模式)
与信号驱动相关的设置
对该文件i-node对象的引用
文件类型(例如:常规文件、套接字或FIFO)和访问权限
一个指针,指向该文件所持有的锁列表
文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳
3、文件系统的inode表
每个文件系统会为存储于其上的所有文件维护一个inode表
文件描述符表、打开文件表、inode表之间的关系:
进程A文件描述符1和20指向同一个打开文件句柄,是因为多次调用open()等函数打开同一个文件导致。
进程A的文件描述符2和进程B的文件描述符2指向同一个打开文件句柄可能是因为调用fork()后出现的,子进程会继承父进程的打开文件描述符表,也就是子进程继承父进程打开文件。;或者某进程通过unix域套接字将一个打开的文件描述符传递给另一个进程;或者不通进程独自调用open函数打开同一个文件是正好分配到与其他进程打开该文件描述符一样。
进程A的描述符0和进程B的描述符3分别指向不同的打开文件句柄,但这些句柄均指向i-node表的相同条目,即同一个文件,发生这种情况是因为每个进程各自对同一个文件发起了open()调用。同一个进程两次打开同一个文件,也会发生类似情况。
二、文件指针 *FILE
C语言中使用的是文件指针而不是文件描述符作为I/O的句柄,“文件指针(file pointer)”指向进程用户区中的一个被称为FILE结构的数据结构。当通过文件指针操作文件时,需要调用C语言stdio.h中提供的文件API(fopen()、fread()等)。
文件描述符在POSIX系统调用中直接可见,文件指针是C语言在其基础上的包装。
int open(const char *path, int access,int mode)
FILE *fopen(char *filename, char *mode)
文件路径 到 文件指针:
filepath –fopen()–
暂无评论内容