我在 64 位 Linux 计算机上遇到一个问题,其中
getconf
命令和 sysconf()
函数将 SSIZE_MAX
的值报告为 32767
,这是 POSIX 要求的最小值。然而,对于 64 位系统来说,这个值似乎异常低。相比之下,SSIZE_MAX
中定义的limits.h
是0x7FFFFFFFFFFFFFFF
,它更符合我对 64 位平台的期望。谁能解释为什么SSIZE_MAX
的报告值有如此显着的差异?
#include <stdio.h>
#include <limits.h> // For SSIZE_MAX
#include <unistd.h> // For sysconf
int main() {
// Print the SSIZE_MAX from limits.h
printf("SSIZE_MAX from limits.h: %zd\n", SSIZE_MAX);
// Get and print the SSIZE_MAX from sysconf
long sysconf_value = sysconf(_SC_SSIZE_MAX);
if (sysconf_value == -1) {
printf("Failed to get SSIZE_MAX from sysconf");
} else {
printf("SSIZE_MAX from sysconf: %ld\n", sysconf_value);
}
return 0;
}
这里有数字:
$ gcc test.c
$ ./a.out
SSIZE_MAX from limits.h: 9223372036854775807
SSIZE_MAX from sysconf: 32767
$ getconf SSIZE_MAX
32767
GNU 文档对
sysconf()
1 做了以下说明:
我们建议您首先测试您感兴趣的参数的宏定义,只有在宏未定义时才调用 sysconf
我们是否可以得出这样的结论:如果
SSIZE_MAX
已经定义,使用 sysconf()
检索其值可能会产生不正确的结果?还是建议避免使用 sysconf()
只是为了消除不必要的函数调用,这意味着如果定义了宏,则应直接使用其值,因为理论上两个源应提供相同的值?
编辑:看起来 glibc 返回
_POSIX_SSIZE_MAX
和 sysconf(_SC_SSIZE_MAX)
2:
//
case _SC_SSIZE_MAX:
return _POSIX_SSIZE_MAX;
//
一些程序员报告说这些接口中的 SSIZE_MAX 信息是 glibc 扩展。
对于 glibc,
getconf SSIZE_MAX
致电sysconf( _SC_SSIZE_MAX )
。sysconf( _SC_SSIZE_MAX )
返回 _POSIX_SSIZE_MAX
(不是 SSIZE_MAX
)。_POSIX_SSIZE_MAX
固定为32767
。