【问题标题】:Directory Inode vs Regular File Inode目录 Inode 与常规文件 Inode
【发布时间】:2012-04-15 03:28:15
【问题描述】:

我可以查看 linux 内核的 inode 结构中的哪些值来判断我当前查看的 inode 是用于目录还是常规文件?

我已经搜索了 inode,但似乎无法找到一个看起来像它有我想要的成员,因为我使用的是较旧的内核版本,我将在下面发布结构 (2.6.24)

struct inode 
  {
     struct hlist_node  i_hash;
     struct list_head   i_list;
     struct list_head   i_sb_list;
     struct list_head   i_dentry;
     unsigned long      i_ino;
     atomic_t           i_count;
     unsigned int       i_nlink;
     uid_t              i_uid;
     gid_t              i_gid;
     dev_t              i_rdev;
     unsigned long      i_version;
     loff_t             i_size;
     struct timespec    i_atime;
     struct timespec    i_mtime;
     struct timespec    i_ctime;
     unsigned int       i_blkbits;
     blkcnt_t           i_blocks;
     unsigned short     i_bytes;
     umode_t            i_mode;
     spinlock_t         i_lock;
     struct mutex       i_mutex;
     struct rw_semaphore              i_alloc_sem;
     const struct inode_operations   *i_op;
     const struct file_operations    *i_fop;
     struct super_block              *i_sb;
     struct file_lock                *i_flock;
     struct address_space            *i_mapping;
     struct address_space             i_data;
     struct list_head                 i_devices;

     union {
               struct pipe_inode_info *i_pipe;
               struct block_device    *i_bdev;
               struct cdev            *i_cdev;
            };

     int            i_cindex;
     __u32          i_generation;
     unsigned long  i_state;
     unsigned long  dirtied_when;   
     unsigned int   i_flags;
     atomic_t       i_writecount;
     void           *i_private;
   };

任何帮助将不胜感激。

【问题讨论】:

  • @user1131467 我不确定,我一直认为关于文件的所有内容都存储在 inode 中,除了它的名称和数据。所以我期待能够从 inode 中分辨出来。

标签: linux kernel inode


【解决方案1】:

我相信是inode的模式……

umode_t            i_mode;

要访问该字段,请参阅 stat(2) 手册页:

   The following POSIX macros are defined to check the file type using the st_mode field:

       S_ISREG(m)  is it a regular file?

       S_ISDIR(m)  directory?

       S_ISCHR(m)  character device?

       S_ISBLK(m)  block device?

       S_ISFIFO(m) FIFO (named pipe)?

       S_ISLNK(m)  symbolic link? (Not in POSIX.1-1996.)

       S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

这是来自Linux driver for minix FS的一些示例代码:

434 void minix_set_inode(struct inode *inode, dev_t rdev)
435 {
436         if (S_ISREG(inode->i_mode)) {
437                 inode->i_op = &minix_file_inode_operations;
438                 inode->i_fop = &minix_file_operations;
439                 inode->i_mapping->a_ops = &minix_aops;
440         } else if (S_ISDIR(inode->i_mode)) {
441                 inode->i_op = &minix_dir_inode_operations;
442                 inode->i_fop = &minix_dir_operations;
443                 inode->i_mapping->a_ops = &minix_aops;
444         } else if (S_ISLNK(inode->i_mode)) {
445                 inode->i_op = &minix_symlink_inode_operations;
446                 inode->i_mapping->a_ops = &minix_aops;
447         } else
448                 init_special_inode(inode, inode->i_mode, rdev);
449 }
450 

【讨论】:

  • 我需要一些位掩码并使用 i_mode 来获取类型吗?
  • @NiklasB: stat 允许用户空间访问 inode 信息。我相信它使用相同的宏访问。
  • @NiklasB。我认为他们是说将这些宏与 struct inode 的 i_mode 成员一起使用会告诉我 inode 是文件还是目录。
  • 谢谢,这很有帮助。
  • @NiklasB 好吧,我实际上正在查看从 linux 内核中切出的内存,所以我不能真正使用这些宏来查找 inode 是用于常规文件还是目录。但它指出了这些宏的定义位置,所以现在我可以使用我在某个函数中从内存中解析的数据执行位掩码,以查找 inode 的类型。
猜你喜欢
  • 2011-05-13
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2016-07-05
  • 2017-01-14
  • 2011-05-21
相关资源
最近更新 更多