代码之家  ›  专栏  ›  技术社区  ›  Josh Matthews

为什么ARG_MAX不是通过limits.h定义的?

  •  7
  • Josh Matthews  · 技术社区  · 16 年前

    在FedoraCore7上,我正在编写一些依赖于 ARG_MAX . 然而,即使我 #include <limits.h> ,该常量仍未定义。我的调查显示它存在于 <sys/linux/limits.h> ,但这应该可以跨Win32/Mac/Linux移植,因此直接包含它不是一个选项。这是怎么回事?

    2 回复  |  直到 14 年前
        1
  •  8
  •   Thomas Kammeyer    16 年前

    它不在limits.h中的原因是,它不是一个根据当前体系结构上的位宽度给出整数类型的值范围限制的量。这是ISO标准分配给limits.h的角色。

    您感兴趣的价值在实践中并不受硬件限制,可能因平台而异,也可能因系统构建而异。

    正确的做法是打电话 sysconf 并用“ARG_MAX”或“_POSIX_ARG_MAX”来表示。我

    根据我的文档,根据您请求的值,您可以包括一个或两个unistd.h或limits.h。

    还有一点:如果您试图在超大环境中调用exec函数族,那么exec函数族的许多实现都会返回E2BIG或类似的值。这是exec可以实际返回的定义条件之一。

        2
  •  1
  •   TheDudeAbides    3 年前

    为了启发像我这样的未来人,他们在网上搜索后发现自己在这里” arg_max posix

    cc -x c <(echo '
      #include <unistd.h>
      #include <stdio.h>
      int main() { printf("%li\n", sysconf(_SC_ARG_MAX)); }
    ')
    

    这使用 process substitution Bash的特点;将相同的行放入文件并运行 cc thefile.c 如果您正在使用其他shell。

    $ ./a.out
    262144
    

    $ ./a.out
    4611686018427387903
    
    $ ./a.out | numfmt --to=iec-i  # 'numfmt' from GNU coreutils
    4.0Ei
    

    相比之下,以下是 https://porkmail.org/era/unix/arg-max.html ,它使用C预处理器:

    cpp <<HERE | tail -1
    #include <limits.h>
    ARG_MAX
    HERE
    

        3
  •  -1
  •   Jingguo Yao    12 年前

    ARG_MAX在/usr/include/linux/limits.h中定义。我的linux内核版本是3.2.0-38。