为什么ARG_MAX没有通过limits.h定义?

发布于 2024-07-04 10:29:58 字数 235 浏览 8 评论 0 原文

在 Fedora Core 7 上,我正在编写一些依赖于 ARG_MAX 的代码。 但是,即使我#include ,该常量仍然没有定义。 我的调查显示它存在于 中,但这应该可以跨 Win32/Mac/Linux 移植,因此直接包含它不是一个选择。 这里发生了什么?

On Fedora Core 7, I'm writing some code that relies on ARG_MAX. However, even if I #include <limits.h>, the constant is still not defined. My investigations show that it's present in <sys/linux/limits.h>, but this is supposed to be portable across Win32/Mac/Linux, so directly including it isn't an option. What's going on here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

陈独秀 2024-07-11 10:29:58

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

ARG_MAX is defined in /usr/include/linux/limits.h. My linux kernel version is 3.2.0-38.

不再让梦枯萎 2024-07-11 10:29:58

为了启发像我这样的未来人,他们在网络搜索“arg_max posix”,这里演示了 Thomas Kammeyer 在他的回答中提到的用于识别系统上的 ARG_MAX 的 POSIXly 正确方法:

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

这使用 进程替换 Bash 功能; 如果您使用其他 shell,请将相同的行放入文件中并运行 cc thefile.c。

以下是 macOS 10.14 的输出:

$ ./a.out
262144

以下是配置为在 HPC 环境中使用的 RHEL 7.x 系统的输出:

$ ./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

由于某些原因,这在 Linux 上不起作用我仍然不完全清楚——我不是系统程序员,也不熟悉 POSIX 或 ISO 规范——但可能在上面解释过。

For the edification of future people like myself who find themselves here after a web search for "arg_max posix", here is a demonstration of the POSIXly-correct method for discerning ARG_MAX on your system that Thomas Kammeyer refers to in his answer:

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

This uses the process substitution feature of Bash; put the same lines in a file and run cc thefile.c if you are using some other shell.

Here's the output for macOS 10.14:

$ ./a.out
262144

Here's the output for a RHEL 7.x system configured for use in an HPC environment:

$ ./a.out
4611686018427387903

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

For contrast, here is the method prescribed by https://porkmail.org/era/unix/arg-max.html, which uses the C preprocessor:

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

This does not work on Linux for reasons still not entirely clear to me—I am not a systems programmer and not conversant in the POSIX or ISO specs—but probably explained above.

超可爱的懒熊 2024-07-11 10:29:58

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

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

正确的做法是调用 sysconf 并询问“ARG_MAX”或“_POSIX_ARG_MAX”。 无论如何,我认为这就是符合 POSIX 标准的解决方案。

附件。 在我的文档中,您可以根据您请求的值包含unistd.h 或limits.h 之一或两者。

另一点:如果您尝试在超大环境中调用 exec 系列函数,许多实现都会返回 E2BIG 或类似的值。 这是 exec 实际返回的已定义条件之一。

The reason it's not in limits.h is that it's not a quantity giving the limits of the value range of an integral type based on bit width on the current architecture. That's the role assigned to limits.h by the ISO standard.

The value in which you're interested is not hardware-bound in practice and can vary from platform to platform and perhaps system build to system build.

The correct thing to do is to call sysconf and ask it for "ARG_MAX" or "_POSIX_ARG_MAX". I think that's the POSIX-compliant solution anyway.

Acc. to my documentation, you include one or both of unistd.h or limits.h based on what values you're requesting.

One other point: many implementations of the exec family of functions return E2BIG or a similar value if you try to call them with an oversized environment. This is one of the defined conditions under which exec can actually return.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文