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の定義を誤解していませんか?それは実際には引数のバイト(またはおそらく文字)の長さで、区切りスペースがあるかどうか(?)があるようです。それが実際にバイト長である場合、他の制限もありますか?