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

转载自:http://blog.csdn.net/wangchaoxjtuse/article/details/6036816

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

 

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



这个是inode的结构,很多内容看这个结构的话就能够很清晰。。。话说原来的博主是咋么把截图弄上去的,多好看,俺只能复制下结构出来,(ˇˍˇ) 想~

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;
  };



fd和inode的关系区别和联系还涉及到目录的关系,千丝万缕,这章说不清楚。。。关键自己要把握fd和inode,目录,i-number等的定义,有了定义,再加联系,才能了然于心

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值