Linux 上的 limit.h、getconf/sysconf 之间的 SSIZE_MAX 不同值

问题描述 投票:0回答:1

我在 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;
//
c linux gcc posix
1个回答
0
投票

一些程序员报告说这些接口中的 SSIZE_MAX 信息是 glibc 扩展。

对于 glibc,

  1. getconf SSIZE_MAX
    致电
    sysconf( _SC_SSIZE_MAX )
  2. sysconf( _SC_SSIZE_MAX )
    返回
    _POSIX_SSIZE_MAX
    (不是
    SSIZE_MAX
    )。
  3. _POSIX_SSIZE_MAX
    固定为
    32767
© www.soinside.com 2019 - 2024. All rights reserved.