为什么ARG_MAX没有通过limits.h定义?
在 Fedora Core 7 上,我正在编写一些依赖于 ARG_MAX
的代码。 但是,即使我#include
,该常量仍然没有定义。 我的调查显示它存在于
中,但这应该可以跨 Win32/Mac/Linux 移植,因此直接包含它不是一个选择。 这里发生了什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
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.
为了启发像我这样的未来人,他们在网络搜索“arg_max posix”,这里演示了 Thomas Kammeyer 在他的回答中提到的用于识别系统上的 ARG_MAX 的 POSIXly 正确方法:
这使用 进程替换 Bash 功能; 如果您使用其他 shell,请将相同的行放入文件中并运行 cc thefile.c。
以下是 macOS 10.14 的输出:
以下是配置为在 HPC 环境中使用的 RHEL 7.x 系统的输出:
作为对比,以下是 https://porkmail.org/era/unix/arg-max.html,它使用 C 预处理器:
由于某些原因,这在 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:
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:
Here's the output for a RHEL 7.x system configured for use in an HPC environment:
For contrast, here is the method prescribed by https://porkmail.org/era/unix/arg-max.html, which uses the C preprocessor:
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.
它不在 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.