次のような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
exec(3) 関数シリーズのパラメータの最大長です。 _POSIX_ARG_MAX(4096) より小さくできません。
環境データを含む exec 関数の引数の最大長。許容最小値:{_POSIX_ARG_MAX}