什么是\`S_ISREG()\`,它有什么作用?

新手上路,请多包涵

我在一个检索文件属性的 C 程序中遇到了宏 S_ISREG() 。不幸的是,网上没有关于这个宏的任何基本信息。对此有一些更高级的讨论,但它们超出了我的要求。

什么是 S_ISREG() ,它有什么作用?在检索文件属性的程序的上下文中,它的用途是什么,它究竟做了什么?

谢谢你。

原文由 The Pointer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

S_ISREG() 是一个宏,用于解释从系统调用 stat() 返回的 stat-struct 中的值。如果参数(struct stat 中的 st_mode 成员)是常规文件,则计算结果为 true。

有关详细信息,请参见 man statman fstatman inode链接到 inode 手册页)。这是手册页的相关部分:

    Because tests of the above form are common, additional macros are defined by POSIX to allow the test of the file type in st_mode to be written more concisely:

       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.)

   The preceding code snippet could thus be rewritten as:

       stat(pathname, &sb);
       if (S_ISREG(sb.st_mode)) {
           /* Handle regular file */
       }

原文由 Bjorn A. 发布,翻译遵循 CC BY-SA 4.0 许可协议

它测试使用 stat() 函数检索到的 --- st_mode stat 结构的成员,以确定文件是在磁盘上还是在大容量存储上(即比说一个目录,套接字,符号链接例如。

 struct stat sb;
if( stat( file_path, &sb) != -1) // Check the return value of stat
{
    if( S_ISREG( sb.st_mode ) != 0 )
    {
        printf( "%s is a file", file_path ) ;
    }
    else
    {
        printf( "%s is not a file", file_path ) ;
    }
}

st_mode 成员包含被 S_IFMT (0170000) 屏蔽的 4 位。这些位的值是:

        S_IFSOCK   0140000   socket
       S_IFLNK    0120000   symbolic link
       S_IFREG    0100000   regular file
       S_IFBLK    0060000   block device
       S_IFDIR    0040000   directory
       S_IFCHR    0020000   character device
       S_IFIFO    0010000   FIFO

所以宏 S_ISREG 可以这样定义:

 #define S_ISREG( m ) (((m) & S_IFMT) == S_IFREG)

由于它是一个宏,您可以在头文件 sys/stat.h 中查看它的实际定义。在 GNU 标头中,它是这样定义的:

 #define __S_ISTYPE(mode, mask)  (((mode) & __S_IFMT) == (mask))
...
#define S_ISREG(mode)    __S_ISTYPE((mode), __S_IFREG)

这在我的简化版本中基本相同。

原文由 Clifford 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题