C POSIX STATVS要求的行为

C POSIX STATVS要求的行为,c,filesystems,posix,standards,C,Filesystems,Posix,Standards,POSIX描述说: 可以在f_flag成员中返回以下标志: 只读文件系统 ST_NOSUID-Setuid/setgid位被exec忽略 未指定statvfs结构的所有成员是否在所有文件系统上都具有有意义的值 另请说明: 标题应为f_标志成员定义以下符号常量: 只读文件系统 ST_NOSUID-不支持ST_ISUID和ST_ISGID文件模式位的语义 如何正确理解这一点?我的意思是: 它是否允许POSIX兼容系统返回无意义的信息,而ST_RDONLY是有意义的 若statvfs结构成员

POSIX描述说:

可以在f_flag成员中返回以下标志:

  • 只读文件系统
  • ST_NOSUID-Setuid/setgid位被exec忽略
未指定statvfs结构的所有成员是否在所有文件系统上都具有有意义的值

另请说明:

标题应为f_标志成员定义以下符号常量:

  • 只读文件系统
  • ST_NOSUID-不支持ST_ISUID和ST_ISGID文件模式位的语义
如何正确理解这一点?我的意思是:

  • 它是否允许POSIX兼容系统返回无意义的信息,而
    ST_RDONLY
    是有意义的
  • 若statvfs结构成员对于特定的文件系统是有意义的,那个么操作系统是否允许返回无意义的内容(我知道有些字段对于像/proc这样的合成文件系统可能并没有意义)

对于用于存储数据/可执行文件的文件系统,是否有已知的操作系统返回不正确的
ST_RDONLY
ST_NOSUID
,同时声称其
statvfs()
实现与POSIX兼容?

POSIX规范除了存在之外,对
statvfs()
的要求很少

特别是,它要求
statvfs()
用“关于文件系统的信息”填充指定的
struct statvfs*
缓冲区,但不保证该信息的含义。换句话说,它可能是完全的垃圾,事实上在许多系统上都存在(包括OSX上的HFS+)

包括
struct statvfs
f_标志
成员,可以将其屏蔽为
ST_RDONLY
和/或
ST_NOSUID
,但并非所有文件系统上都有许多标志(即使它应该是)


如果您需要跨多个平台可靠地获取文件系统信息,那么(具有讽刺意味的是)可能必须求助于非标准函数,如
statfs()
。但是,在Linux上,
statvfs()
在大多数非合成文件系统上表现得非常好。

通常,对于标志类型的结构值,如果您感兴趣,例如
ST_RDONLY
,您只需通过
(f&ST_RDONLY)==ST_RDONLY
(f&ST_RDONLY)
,测试该位,并且不关心标志字中其他位的值。所以一个“无意义”的值并不是很有趣,因为它可能有额外的位用于非标准的东西…@twalberg,statvfs结构包含更多的字段,而不仅仅是
ft\u flag
。我知道如何看待他们的价值观。我不明白这些值什么时候可以被信任。@kestasx它们不能被信任,至少在POSIX中不能。Linux优雅地处理statvfs,但OSX和FreeBSD都返回垃圾成员数据。在这些平台上,
statfs
通常表现得更好。@woodruff,感谢您的回复。我刚才在看FreeBSD(v9.1),从我所看到的来看,似乎没有什么区别
statvfs()
statfs()
return(字段的含义相同)。测试ufs和zfs。如果你有一些例子来证实这个网站,你可以发布它吗?谢谢你的回答。您是否可以发布数据确认这些不一致性(特别是关于ST_RDONLY和ST_NOSUID)?或示例以确认
statvfs()
返回垃圾,而
statfs()
显示正确的信息(对于非合成文件系统)?我知道对standart的类似解释(FreeBSD手册,2002年),但我感兴趣的是这种解释是否有效(从形式上看),以及它是否在现实世界中仍然有效(现在是2014年,standart和操作系统实现都发生了变化)。我不再有mac,但我记得测试
statvfs()
当我这样做的时候。我从未检查过
f_标志
成员,但其他成员会在HFS+分区上返回垃圾。您可能想在FreeBSD虚拟机中试用它。POSIX对
statvfs()
规范非常宽容。我知道OSX的
statvfs()
符合POSIX标准,FreeBSD的最新手册页也声称这一点。它给出的警告非常有用(简称):“作为标准化的,便携式应用程序根本不能依赖于这些函数返回任何有效信息。”我已经检查了FreeBSD-9.1(参见问题下面的注释)。我也读过它的手册页,但我不确定它是对标准的正确和最新的解释,特别是关于
f_标志
值。我正在寻找正式/官方的解释,或可验证的例子。标准还不够清晰吗?它说,没有一个成员可以被信任有合理的价值观。唯一可以保证的是
statvfs()
函数和
statvfs
结构的存在。因此,
f_标志
的含义完全取决于操作系统,而不是POSIX。如果您需要这方面的具体示例,请查看QNX的
statvfs()
。它列出了操作系统可以正确读取的文件系统。感谢您的链接。Standart的措辞不同——我怀疑它将返回值链接到文件系统属性。我认为您链接的QNX手册证实了这一点——在相关/已知的操作系统中返回正确的值)。Solaris 11手册似乎也是如此。