linux1.2.13 file结构体管理是怎样的
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"linux1.2.13 file结构体管理是怎样的"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能
千家信息网最后更新 2026年11月03日linux1.2.13 file结构体管理是怎样的
本篇内容介绍了"linux1.2.13 file结构体管理是怎样的"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
操作系统为进程维护了打开的文件列表,每个进程维护了一个file数组字段(struct file * fd[NR_OPEN]);每个元素指向一个file结构体。每个file结构体有一个字段指向inode结构体,inode管理这个文件的内容、权限等信息。这里分析的是file结构体的管理。
下面是file结构体的定义
struct file { mode_t f_mode; loff_t f_pos; unsigned short f_flags; unsigned short f_count; off_t f_reada; struct file *f_next, *f_prev; int f_owner; /* pid or -pgrp where SIGIO should be sent */ struct inode * f_inode; struct file_operations * f_op; unsigned long f_version; void *private_data; /* needed for tty driver, and maybe others */};下面是对file结构体的管理,当进程打开一个文件的时候,就可能需要从中申请一个file结构体。
/** linux/fs/file_table.c** Copyright (C) 1991, 1992 Linus Torvalds*/#include#include#includestruct file * first_file;int nr_files = 0;// 双向循环链表,first_file指向头指针,头插法插入一个节点static void insert_file_free(struct file *file){file->f_next = first_file;file->f_prev = first_file->f_prev;file->f_next->f_prev = file;file->f_prev->f_next = file;first_file = file;}// 删除一个节点static void remove_file_free(struct file *file){// 如果要删除的节点是第一个节点,则更新头指针,指向下一个节点if (first_file == file)first_file = first_file->f_next;// 如果被删除的节点后面还有节点,则需要更新下一个节点的prev指针,指向当前节点的上一个节点if (file->f_next)file->f_next->f_prev = file->f_prev;// 同理,更新上一个节点的next指针,指向被删除节点的下一个节点if (file->f_prev)file->f_prev->f_next = file->f_next;// 置空file->f_next = file->f_prev = NULL;}// file插入链表,成为最后一个节点static void put_last_free(struct file *file){// 保证file脱离了原来的链表remove_file_free(file);// 插入链表,但是不更新头指针first_file,所以file成为最后一个节点file->f_prev = first_file->f_prev;file->f_prev->f_next = file;file->f_next = first_file;file->f_next->f_prev = file;}void grow_files(void){struct file * file;int i;// 申请一页内存file = (struct file *) get_free_page(GFP_KERNEL);if (!file)return;// i=PAGE_SIZE/sizeof(struct file),即一页可以存多少个节点,更新最大节点数nr_files+=i= PAGE_SIZE/sizeof(struct file);/*当前是初始化的时候,先初始化一个节点,需要初始化的节点数减一,执行insert_file_free前需要保证first_file非空,见insert_file_free中的first_file*/if (!first_file)file->f_next = file->f_prev = first_file = file++, i--;// 形成一个链表for (; i ; i--)insert_file_free(file++);}// file链表初始化unsigned long file_table_init(unsigned long start, unsigned long end){first_file = NULL;return start;}// 获取一个可以的file结构体struct file * get_empty_filp(void){int i;struct file * f;if (!first_file)grow_files();repeat:// nr_files是链表的总节点数for (f = first_file, i=0; i < nr_files; i++, f = f->f_next)// 找到空闲的节点if (!f->f_count) {// 脱离链表remove_file_free(f);// 清空内存memset(f,0,sizeof(*f));// 插入链表末尾put_last_free(f);// 标记已使用f->f_count = 1;f->f_version = ++event;return f;}// 没有找到空闲节点,扩容,再找if (nr_files < NR_FILE) {grow_files();goto repeat;}return NULL;}

从图中我们可以看出,系统维护了一个双向循环的链表,保存了一系列已使用和未使用的file结构体。first_file指针执行第一个空闲的节点,进程申请file结构体的时候就把该节点放到链表结尾。first_file指针指向下一个空闲节点。如果没有空闲节点了,就会自动扩容。
"linux1.2.13 file结构体管理是怎样的"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
节点
结构
指针
指向
管理
空闲
更新
进程
内容
文件
时候
点数
内存
双向
字段
更多
知识
系统
保证
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技公司
科技互联网企业
中国互联网科技股
智能科技公司是互联网公司吗
金融科技与互联网金融
佰商互联网科技有限公司
中国互联网金融科技基金
哈尔滨秒房互联网科技有限公司
济南华为互联网科技产业总部基地
恒银科技与互联网金融
来此购互联网科技有限公司
互联网科技研发水平
中国科技创新与世界互联网大会
厦门江牛科技互联网
九思连强互联网电子科技有限公司
互联网科技平台产品运营
科技互联网经济论坛
互联网科技大会大佬
互联网科技自媒体灵感
广州全民伙伴互联网科技有限公司
南京欣网互联网科技
广州凡科互联网科技
深圳天众互联网科技公司
互联网高科技股票
上海亿帐通互联网科技
互联网 科技服务平台
华服互联网科技官网
互联网科技与大数据专业
江苏苏星互联网科技有限公司
抖集互联网科技技术咨询