i节点(inode)和文件描述符(file descriptor)的区别和联系

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

   inode 或i节点是指对文件的索引。如一个系统,所有文件是放在磁盘或flash上,就要编个目录来说明每个文件在什么地方,有什么属性,及大小等。就像书本的目录一样,便于查找和管理。这目录是操作系统需要的,用来找文件或叫管理文件。许多操作系统都用到这个概念,如linux, 某些嵌入式文件系统等。当然,对某个系统来说,有许多i节点。所以对i节点本身也是要进行管理的。

    在linux中,内核通过inode来找到每个文件,但一个文件可以被许多用户同时打开或一个用户同时打开多次。这就有一个问题,如何管理文件的当前位移量,因为可能每个用户打开文件后进行的操作都不一样,这样文件位移量也不同,当然还有其他的一些问题。所以linux又搞了一个文件描述符(file descriptor)这个东西,来分别为每一个用户服务。每个用户每次打开一个文件,就产生一个文件描述符,多次打开就产生多个文件描述符,一一对应,不管是同一个用户,还是多个用户。该文件描述符就记录了当前打开的文件的偏移量等数据。所以一个i节点可以有0个或多个文件描述符。多个文件描述符可以对应一个i节点。

view plaincopy to clipboardprint?
struct inode {   
  struct list_headi_hash;   
  struct list_headi_list;   
  struct list_headi_dentry;   
  struct list_headi_dirty_buffers;   
  unsigned longi_ino; /*每一个inode都有一个序号,经由super block结构和其序号,我们可以很轻易的找到这个inode。*/  
  atomic_t i_count; /*在Kernel里,很多的结构都会记录其reference count,以确保如果某个结构正在使用,它不会被不小心释放掉,i_count就是其reference count。*/  
  kdev_t i_dev; /* inode所在的device代码 */  
  umode_t i_mode; /* inode的权限 */  
  nlink_t i_nlink; /* hard link的个数 */  
  uid_t i_uid; /* inode拥有者的id */  
  gid_t i_gid; /* inode所属的群组id */  
  kdev_t i_rdev; /* 如果inode代表的是device的话,那此字段将记录device的代码 */  
  off_t i_size; /* inode所代表的档案大小 */  
  time_t i_atime; /* inode最近一次的存取时间 */  
  time_t i_mtime; /* inode最近一次的修改时间 */  
  time_t i_ctime; /* inode的产生时间 */  
  unsigned long i_blksize; /* inode在做IO时的区块大小 */  
  unsigned long i_blocks; /* inode所使用的block数,一个block为512 byte*/  
  unsigned long i_version; /* 版本号码 */  
  unsigned short i_bytes;   
  struct semaphore i_sem;   
  struct rw_semaphore i_truncate_sem;   
  struct semaphore i_zombie;   
  struct inode_operations *i_op;   
  struct file_operations *i_fop;/* former ->i_op->default_file_ops */  
  struct super_block *i_sb; /* inode所属档案系统的super block */  
  wait_queue_head_t i_wait;   
  struct file_lock *i_flock; /* 用来做file lock */  
  struct address_space *i_mapping;   
  struct address_space i_data;   
  struct dquot *i_dquot [MAXQUOTAS];   
  /* These three should probably be a union */  
  struct pipe_inode_info *i_pipe;   
  struct block_device *i_bdev;   
  struct char_device *i_cdev;   
  unsigned longi_dnotify_mask; /* Directory notify events */  
  struct dnotify_struct *i_dnotify; /* for directory notifications */  
  unsigned long i_state; /* inode目前的状态,可以是I_DIRTY,I_LOCK和 I_FREEING的OR组合 */  
  unsigned int i_flags; /* 记录此inode的参数 */  
  unsigned char i_sock; /* 用来记录此inode是否为socket */  
  atomic_t i_write count;   
  unsigned int i_attr_flags; /* 用来记录此inode的属性参数 */  
  __u32 i_generation;   
  union {   
  struct minix_inode_info minix_i;   
  struct ext2_inode_info ext2_i;   
  struct ext3_inode_info ext3_i;   
  struct hpfs_inode_info hpfs_i;   
  struct ntfs_inode_info ntfs_i;   
  struct msdos_inode_info msdos_i;   
  struct umsdos_inode_info umsdos_i;   
  struct iso_inode_info isofs_i;   
  struct sysv_inode_info sysv_i;   
  struct affs_inode_info affs_i;   
  struct ufs_inode_info ufs_i;   
  struct efs_inode_info efs_i;   
  struct romfs_inode_info romfs_i;   
  struct shmem_inode_info shmem_i;   
  struct coda_inode_info coda_i;   
  struct smb_inode_info smbfs_i;   
  struct hfs_inode_info hfs_i;   
  struct adfs_inode_info adfs_i;   
  struct qnx4_inode_info qnx4_i;   
  struct reiserfs_inode_info reiserfs_i;   
  struct bfs_inode_info bfs_i;   
  struct udf_inode_info udf_i;   
  struct ncp_inode_info ncpfs_i;   
  struct proc_inode_info proc_i;   
  struct socketsocket_i;   
  struct usbdev_inode_info usbdev_i;   
  struct jffs2_inode_infojffs2_i;   
  void *generic_ip;   
  } u;   
  }; 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wangchaoxjtuse/archive/2010/11/26/6036816.aspx

python -- 海洋气象科研论文中常用绘图配色汇总 当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。可以通过自定义选取不同颜色的rgb,通过自定义的方式构建colormap。 阅读详情

相关推荐

ss524v100 调试cvbs输出

启用视频层3 dev2 对应 layer3在vdec与vo绑定的时候(不需要经过vpss),不能绑定错误,以下是绑定的程序。

2085

文件描述符(file descriptor)详解,让你彻底了解计算机系统!

文件描述符是一个与输入/输出资源相关的整数,也可以被称为文件句柄(file handle)、文件指针(file pointer)或文件引用(file reference)。简单来说,它是操作系统为了管理 I/O 操作而维护的一个表中的索引,代表着系统中打开的文件的一个“门牌号”。这个表通常被称为文件描述符(file descriptor table),其中每个条目描述了一个打开的文件,并包含文件的类型、读写位置以及其他状态信息。我们可以通过文件描述符来引用这些打开的文件,进行文件读写操作。

m0_72410588的博客 7498

【unity实战】Unity2D TileMap的探究(最简单,最全面的TileMap使用介绍)

之前有人在微信上找我,问了TileMap相关的知识【unity实战】随机地下城生成2——绘制地图Tilemap的使用及一些技巧的使用(含源码)不过写的不是特别不是特别细致,只是简单的用了一下,所有这次特地打算单独写一篇文章,来介绍一下,下次还有人问我,我直接就把这篇文章丢给他,完美!Unity的Tilemap 一般称之为瓦片地图或者平铺地图,是 Unity2017 中新增的功能,主要用于快速编辑 2D 游戏中的场景,通过复用资源的形式提升地图多样性。Tilemap是一个用于创建2D地图的工具。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

文件描述符

有了文件描述符之后,由于global file table处于内核空间中,用户即使拥有fd,也无法得到实际文件对象的地址,除非把fd作为系统调用的参数来使用,如此一来,控制权又回到了内核手中,也便达到了权限控制的目的。进程级的描述符表的每一个条目记录了当前进程所有打开的文件的文件描述符,进程之间相互独立,例如一个进程使用了文件描述符99,另一个进程也可以用99。标准错误标准输出可以重定向到同一个地方,比如指令中的&1表示的就是标准输出,2>&1的含义就是重定向标准错误到标准输出表示的数据流中。

Shared_wisdom的博客 4750

文件描述符(通俗易懂)

该文章主要是针对面试做大致的了解,不做详细介绍!!!一、具体结构说明:1、一个进程能够同时打开多个文件,对应需要多个文件描述符,所以需要用一个文件描述符表对文件描述符进行管理;通常默认大小为1024,也即能容纳1024个文件描述符;2、文件描述符表中0、1、2三个位置对应的文件描述符固定不变,标准输入、标准输出、标准错误;3、当打开一个文件时,内核会自动在文件描述符表中寻找一个空闲且最小的文件描述符;4、同一个文件可以被多次打开,但是每打开一次都需要一个新的文件描述符;5、已经被占用的文件描述符在被释放后,

热爱数据库的小胖 1万+

文件描述符File Descriptor)简介

维基百科:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。 一、文件描述符概念   Linux 系统中,把一切都看做是文件,当进程打开现有文...

weixin_34119545的博客 1228

Linux - 文件描述符 | 文件系统 | 软硬链接

Linux - 文件描述符 | 文件系统 | 软硬链接

2302_79539362的博客 2409

linux系统编程之基础必备(三):文件描述符file descriptorinode的相关知识

每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在操作系统理论中称为进程控制块 (PCB,Process Control Block)。task_struct中有一个指针(struct files_struct *files; )指向files_struct结构体,称为文件 描述符表,其中每个表项包

Meditation 2万+

Linux文件描述符(file descriptor)文件指针

文件描述符(file descriptor): 在linux系统中,设备也是以文件的形式存在,要对该设备进行操作就必须先打开这个文件,打开这个文件就会获得这个文件描述符,它是个很小的正整数,它是一个索引值,指向内核为每一个进程所维护的、该进程打开文件的记录表。 文件描述符的优点:兼容POSIX标准,许多Linux UNIX系统调用都依赖于它。文件描述符的缺点:不能移植...

qq469617582的博客 817

什么是文件描述符File Descriptor

什么是文件描述符File Descriptor)通俗类比Linux 中的标准文件描述符验证文件描述符1. 查看进程打开的文件描述符2. 通过重定向改变指向为什么需要区分 stdout stderr?实际例子深入理解 `&1` 中的 `&`对比两种写法验证区别文件描述符的本质(底层视角)高级玩法:自定义文件描述符实用例子:临时保存标准输出总结要点一句话定义:文件描述符是一个非负整数,是操作系统内核为了管理已打开的文件或资源而分配给进程的"索引号"或"句柄"。# 打开文件并分配描述符 3。

CharlesYuangc的博客 323

linux系统文件描述符file descriptorinode的相关知识

转自: http://blog.csdn.net/simba888888/article/details/8806654   每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在操作系统理论中称为进程控制块 (PCB,Process Control Block)。task_struct

右上角同学的专栏 545

【linux学习】深入理解linux文件I/O,从C标准库到内核态

本文深入解析了Linux文件I/O机制,从C标准库I/O与系统调用的关系入手,揭示了文件描述符的本质是进程文件描述符表的数组下标。通过分析重定向原理,指出其本质是修改内核文件指针指向。文章还探讨了缓冲区的特性及其在fork时的表现差异,解释了"一切皆文件"的设计哲学通过VFS层实现操作系统层面的多态。最后介绍了磁盘物理结构到文件系统逻辑结构的抽象过程,全面阐述了Linux文件I/O从用户态到内核态的完整实现机制。这些知识是理解操作系统文件管理进行系统编程的重要基础。

z20050930的博客 343

Linux文件描述符原理与Shell重定向实现

文件描述符是Linux系统编程的核心概念之一,作为进程访问I/O资源的抽象句柄,其底层通过文件描述符表、文件表inode表三级结构实现。理解描述符的复制(dup/dup2)与继承机制,是掌握Shell重定向、管道等高级特性的基础。本文以minishell开发为例,详解如何通过文件描述符操作实现输入输出重定向、描述符传递等关键功能,并探讨epoll监控、非阻塞IO等高性能场景下的最佳实践。

weixin_30887919的博客 412

Linux文件操作:从open()系统调用到文件描述符原理

在Linux系统编程中,文件操作是最基础且核心的技术之一。文件描述符作为进程与内核交互的关键抽象,本质上是一个整数值索引,指向内核维护的文件表项。通过open()系统调用,程序可以获取文件描述符,进而进行读写等操作。理解文件描述符的工作原理,对于掌握Linux I/O多路复用、进程间通信等高级特性至关重要。在实际工程中,合理使用O_NONBLOCK非阻塞标志O_CLOEXEC等特性,能显著提升程序性能安全性。本文深入分析从用户态open()调用到内核VFS处理的完整链路,揭示文件描述符背后的精妙设计。

weixin_34242331的博客 352

Linux文件描述符深度解析:从内核原理到高并发实战

在操作系统系统编程领域,I/O(输入/输出)管理是核心基础。其原理在于操作系统通过统一的抽象接口来管理各类资源,实现高效、安全的访问。这一技术价值在于为上层应用提供了简洁一致的编程模型,同时为高性能并发处理奠定了基础。其应用场景广泛,涵盖文件读写、网络通信、进程间交互等。本文聚焦于Linux中的关键抽象——文件描述符(fd),深入剖析其作为进程访问I/O资源统一入口的本质。通过解读进程描述符表、系统打开文件表inode表这三层内核数据结构,揭示fd从创建到关闭的生命周期。文章结合epoll、socket

weixin_30700977的博客 396

Linux VFS 深度解析()struct file(文件对象)

Linux VFS 深度解析()struct file(文件对象)摘要 struct file 是 Linux VFS 中表示进程打开文件实例的核心数据结构,与表示磁盘文件的 inode 不同,它记录了文件打开时的运行时状态。关键点包括: 本质区别inode 表示持久化文件元数据,struct file 表示打开实例(含偏移量、访问模式等) 生命周期:从 open() 到 close(),内存中动态创建销毁 多实例性:同一文件可被多次打开,每个打开操作创建独立 struct file 核心字段:

siny_hj的博客 895
上一篇: Fedora16 安装相关
下一篇: 使用iperf测试网络性能
evenness
博客等级 码龄15年 98粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值