Linux 目录索引节点与常规文件索引节点

Linux 目录索引节点与常规文件索引节点,linux,kernel,inode,Linux,Kernel,Inode,我可以查看linux内核inode结构中的哪些值来判断我当前查看的inode是用于目录还是常规文件 我已经搜索了inode,但似乎找不到一个看起来像是我想要的成员,因为我使用的是较旧的内核版本,我将发布下面的结构(2.6.24) 任何帮助都将不胜感激。我相信这是inode的模式 umode_t i_mode; 要访问该字段,请参见统计(2)手册页: The following POSIX macros are defined to check the file ty

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

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


任何帮助都将不胜感激。

我相信这是inode的模式

umode_t            i_mode;
要访问该字段,请参见统计(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.)
下面是来自的一些示例代码:


@user1131467我不确定,我一直认为文件的所有内容都存储在inode中,除了名称和数据。所以我希望能够从inode中分辨出来。是否需要一些位掩码,然后使用I_模式获取类型?@NiklasB:stat允许用户访问inode信息。我相信它是用相同的宏访问的。@NiklasB。我想他们是说,使用带有struct inode的
I_mode
成员的宏可以告诉我inode是文件还是目录。谢谢,这非常有用。@NiklasB我实际上看到的是从linux内核中切下的内存,因此,我无法真正使用这些宏来确定inode是用于常规文件还是目录。但它指出了这些宏的定义位置,因此现在我可以使用从某个函数中的内存解析的数据执行位掩码,以查找inode的类型。
   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.)
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