在 Fedora Core 7 上,我正在编写一些依赖于ARG_MAX
. 但是,即使 I #include <limits.h>
,常量仍然没有定义。我的调查表明它存在于 中<sys/linux/limits.h>
,但这应该可以跨 Win32/Mac/Linux 移植,因此不能直接包含它。这里发生了什么?
3 回答
它不在limits.h中的原因是它不是一个基于当前架构上的位宽给出整数类型值范围限制的量。这是 ISO 标准分配给 limits.h 的角色。
您感兴趣的值在实践中不受硬件限制,并且可能因平台而异,也可能因系统构建而异。
正确的做法是调用sysconf
并询问“ARG_MAX”或“_POSIX_ARG_MAX”。无论如何,我认为这是符合 POSIX 的解决方案。
会计。在我的文档中,根据您请求的值,您包括 unistd.h 或 limits.h 之一或两者。
还有一点:如果您尝试在超大环境中调用 exec 系列函数的许多实现,它们会返回 E2BIG 或类似的值。这是 exec 可以实际返回的已定义条件之一。
为了教育像我这样在网络搜索“ arg_max posix ”后发现自己在这里的未来人,这里演示了在您的系统上识别 ARG_MAX 的 POSIXly-correct 方法,Thomas Kammeyer 在他的回答中提到:
cc -x c <(echo '
#include <unistd.h>
#include <stdio.h>
int main() { printf("%li\n", sysconf(_SC_ARG_MAX)); }
')
这使用了Bash 的进程替换特性;cc thefile.c
如果您使用的是其他 shell ,请将相同的行放在文件中并运行。
这是 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 规范——但可能在上面解释过。
ARG_MAX 在 /usr/include/linux/limits.h 中定义。我的 linux 内核版本是 3.2.0-38。