我在一个检索文件属性的 C 程序中遇到了宏 S_ISREG()
。不幸的是,网上没有关于这个宏的任何基本信息。对此有一些更高级的讨论,但它们超出了我的要求。
什么是 S_ISREG()
,它有什么作用?在检索文件属性的程序的上下文中,它的用途是什么,它究竟做了什么?
谢谢你。
原文由 The Pointer 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在一个检索文件属性的 C 程序中遇到了宏 S_ISREG()
。不幸的是,网上没有关于这个宏的任何基本信息。对此有一些更高级的讨论,但它们超出了我的要求。
什么是 S_ISREG()
,它有什么作用?在检索文件属性的程序的上下文中,它的用途是什么,它究竟做了什么?
谢谢你。
原文由 The Pointer 发布,翻译遵循 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 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
3 回答3.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
S_ISREG() 是一个宏,用于解释从系统调用 stat() 返回的 stat-struct 中的值。如果参数(struct stat 中的 st_mode 成员)是常规文件,则计算结果为 true。
有关详细信息,请参见
man stat
、man fstat
或man inode
( 链接到 inode 手册页)。这是手册页的相关部分: