查找实际最大参数列表长度的规范方法是什么?

查找实际最大参数列表长度的规范方法是什么?

下列的ARG_MAX,新进程的参数最大长度它似乎ARG_MAX在我运行 Ubuntu 12.04 的 Mac Mini 3,1 上定义错误(或至少不明确):

$ getconf ARG_MAX # arguments 
2097152
$ locate limits.h | xargs grep -ho 'ARG_MAX[ \t]\+[0-9]\+' | uniq | cut -d ' ' -f 8
131072

实际的限制似乎介于以下之间:

$ cd "$(mktemp -d)"
$ touch $(seq 1 131072) && find . -mindepth 1 -printf x | wc -c && rm *
131072
$ touch $(seq 1 131073) && find . -mindepth 1 -printf x | wc -c && rm *
131073
$ touch $(seq 1 $(getconf ARG_MAX)) && find . -mindepth 1 -printf x | wc -c && rm *
bash: /usr/bin/touch: Argument list too long

我做了一个小搜索:

cd "$(mktemp -d)"
min=131072
max=2097152
while true
do
    search=$((min + (max - min) / 2))
    if touch $(seq 1 $search) 2>/dev/null
    then
        min=$search
    else
        max=$search
    fi
    [[ $((max - min)) -le 1 ]] && echo "ARG_MAX = $min" && break
done

最终结果是ARG_MAX = 314290,它似乎与之前找到的任何一个值都没有任何关系ARG_MAX。这是正常的吗?有没有更简单的方法来找到实际的ARG_MAX

我是否误解了 ARG_MAX 的定义?看来这实际上是字节(或可能是字符)参数的长度,带或不带(?)分隔空格。如果真的是字节长度,还有吗其他限制

答案1

是的,它是以字节为单位的长度,包括环境。

非常粗略地:

$ { seq 1 314290; env; } | wc -c
2091391

Linux 系统配置

exec(3) 系列函数的参数的最大长度。不得小于 _POSIX_ARG_MAX (4096)。

POSIX 2004 限制.h

exec 函数的参数最大长度,包括环境数据。最小可接受值:{_POSIX_ARG_MAX}

答案2

您链接到的页面关于ARG_MAX声明从内核版本 2.6.23 开始,它是堆栈大小的 1/4。它甚至链接到git 提交负责任的。

相关内容