http://blog.csdn.net/wangchaoxjtuse/article/details/6036816

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

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

[cpp] view plain copy
  1. struct inode {
  2.   struct list_headi_hash;
  3.   struct list_headi_list;
  4.   struct list_headi_dentry;
  5.   struct list_headi_dirty_buffers;
  6.   unsigned longi_ino; /*每一个inode都有一个序号,经由super block结构和其序号,我们可以很轻易的找到这个inode。*/
  7.   atomic_t i_count; /*在Kernel里,很多的结构都会记录其reference count,以确保如果某个结构正在使用,它不会被不小心释放掉,i_count就是其reference count。*/
  8.   kdev_t i_dev; /* inode所在的device代码 */
  9.   umode_t i_mode; /* inode的权限 */
  10.   nlink_t i_nlink; /* hard link的个数 */
  11.   uid_t i_uid; /* inode拥有者的id */
  12.   gid_t i_gid; /* inode所属的群组id */
  13.   kdev_t i_rdev; /* 如果inode代表的是device的话,那此字段将记录device的代码 */
  14.   off_t i_size; /* inode所代表的档案大小 */
  15.   time_t i_atime; /* inode最近一次的存取时间 */
  16.   time_t i_mtime; /* inode最近一次的修改时间 */
  17.   time_t i_ctime; /* inode的产生时间 */
  18.   unsigned long i_blksize; /* inode在做IO时的区块大小 */
  19.   unsigned long i_blocks; /* inode所使用的block数,一个block为512 byte*/
  20.   unsigned long i_version; /* 版本号码 */
  21.   unsigned short i_bytes;
  22.   struct semaphore i_sem;
  23.   struct rw_semaphore i_truncate_sem;
  24.   struct semaphore i_zombie;
  25.   struct inode_operations *i_op;
  26.   struct file_operations *i_fop;/* former ->i_op->default_file_ops */
  27.   struct super_block *i_sb; /* inode所属档案系统的super block */
  28.   wait_queue_head_t i_wait;
  29.   struct file_lock *i_flock; /* 用来做file lock */
  30.   struct address_space *i_mapping;
  31.   struct address_space i_data;
  32.   struct dquot *i_dquot [MAXQUOTAS];
  33.   /* These three should probably be a union */
  34.   struct pipe_inode_info *i_pipe;
  35.   struct block_device *i_bdev;
  36.   struct char_device *i_cdev;
  37.   unsigned longi_dnotify_mask; /* Directory notify events */
  38.   struct dnotify_struct *i_dnotify; /* for directory notifications */
  39.   unsigned long i_state; /* inode目前的状态,可以是I_DIRTY,I_LOCK和 I_FREEING的OR组合 */
  40.   unsigned int i_flags; /* 记录此inode的参数 */
  41.   unsigned char i_sock; /* 用来记录此inode是否为socket */
  42.   atomic_t i_write count;
  43.   unsigned int i_attr_flags; /* 用来记录此inode的属性参数 */
  44.   __u32 i_generation;
  45.   union {
  46.   struct minix_inode_info minix_i;
  47.   struct ext2_inode_info ext2_i;
  48.   struct ext3_inode_info ext3_i;
  49.   struct hpfs_inode_info hpfs_i;
  50.   struct ntfs_inode_info ntfs_i;
  51.   struct msdos_inode_info msdos_i;
  52.   struct umsdos_inode_info umsdos_i;
  53.   struct iso_inode_info isofs_i;
  54.   struct sysv_inode_info sysv_i;
  55.   struct affs_inode_info affs_i;
  56.   struct ufs_inode_info ufs_i;
  57.   struct efs_inode_info efs_i;
  58.   struct romfs_inode_info romfs_i;
  59.   struct shmem_inode_info shmem_i;
  60.   struct coda_inode_info coda_i;
  61.   struct smb_inode_info smbfs_i;
  62.   struct hfs_inode_info hfs_i;
  63.   struct adfs_inode_info adfs_i;
  64.   struct qnx4_inode_info qnx4_i;
  65.   struct reiserfs_inode_info reiserfs_i;
  66.   struct bfs_inode_info bfs_i;
  67.   struct udf_inode_info udf_i;
  68.   struct ncp_inode_info ncpfs_i;
  69.   struct proc_inode_info proc_i;
  70.   struct socketsocket_i;
  71.   struct usbdev_inode_info usbdev_i;
  72.   struct jffs2_inode_infojffs2_i;
  73.   void *generic_ip;
  74.   } u;
  75.   };

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

  1. 文件描述符file descriptor与inode的相关知识

    每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在操作系统理论中称为进程控制块 (PCB,Process ...

  2. linux文件 i节点结构,Linux 文件描述符 文件表项 i节点结构

    Linux的VFS(虚拟文件系统)学习起来很痛苦,看源码不太明智,看完分析完就忘且太浪费时间,懂了后也无法应用在实际场合中.所以这里只是讨论下文件描述符,文件表项(file结构体)和inode,理清实 ...

  3. linux c fopen open 互相转换 文件指针 到 文件描述符 FILE* 转 FD

    FILE*--fileno()--->fd; 实例如下: #include <stdio.h>int main() {FILE *fp = NULL;int i = 0;fp = f ...

  4. 文件句柄(file handles) 文件描述符(file descriptors)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  5. 文件句柄?文件描述符?傻傻分不清楚

    概述 在实际工作中会经常遇到一些bug,有些就需要用到文件句柄,文件描述符等概念,比如报错: too many open files, 如果你对相关知识一无所知,那么debug起来将会异常痛苦.在li ...

  6. Linux网络编程--文件描述符

    文件描述符 在Unix和Unix-like操作系统中,文件描述符(file descriptor, FD)是一个文件或者像pipe或者network socket等之类的输入/输出源的唯一标识. 文件 ...

  7. 深入理解Linux/Unix文件描述符和epoll

    Linux/Unix 文件描述符(File Describer)的本质 Linux/Unix(以下简称Linux)系统中,每个进程都有一个专用的数组,数组的元素是一个结构体,称为文件描述符File D ...

  8. linux文件描述符 0 1 2,文件描述符

    内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定待读写的文件 ...

  9. Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    在Linux中,内核利用文件描述符(File Descriptor)即文件句柄,来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定 ...

最新文章

  1. 如何用python开发游戏_手把手教你用Python完成一个控制台小游戏-阿里云开发者社区...
  2. 会java学scala多久_Scala中超时的未来
  3. 关于微信小程序swiper的问题
  4. EntityFramework进阶——数据编辑与维护
  5. oracle存储一个数字格式,Oracle根本数据类型存储格式研究(二)—数字类型
  6. Linux makefile教程之函数七[转]
  7. Head First 设计模式 —— 单例模式(Singleton)
  8. python小trick持续更新~
  9. 编译U-boot时,make[1]: *** 没有规则可以创建mkimage.o”
  10. 16进制颜色码转化rgba
  11. Android系统启动过程-uBoot+Kernel+Android
  12. php总结与展望_2018年的总结划下句号,展望2019
  13. UVALive 6922 Reverse Polish Notation
  14. 上海某大型企业因盗版Catia被罚千万
  15. SQLite 命令行客户端 sqlite3 使用指南
  16. 计算机速录方法,速录练习技巧方法介绍
  17. html js中间显示悬浮窗,Js 悬浮窗口(可固定位置)代码
  18. 程序编写——四步制作漫画线稿出书
  19. dis反汇编文件的分析理解
  20. BPM常见流程案例:会签流程、或签流程、分支流程、并行流程

热门文章

  1. Python入门习题大全——喜欢的水果
  2. Microsoft AjaxToolkits 17. UpdatePanelAnimation控件
  3. 生存还是毁灭?新物种爆发时代,企业请回答
  4. 翻翻git之---简单的配置达到产品在应用市场的评价跳转功能
  5. 关于参加大学生数学竞赛的一点感悟与体会
  6. 数据结构期末考试复习整理
  7. Python列表去重的六种方法
  8. 悠漓带你浅谈C语言2(数据类型)
  9. android接入第三方SDK
  10. matlab for循环教程,Matlab for循环使用操作教程分享