在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的定义?似乎实际上是带或不带(?)分隔符的参数的字节(或可能是字符)长度。如果确实是字节长度,还有其他限制吗?