実際の最大パラメータリストの長さを見つけるための標準的な方法は何ですか?

実際の最大パラメータリストの長さを見つけるための標準的な方法は何ですか?

次のようなARG_MAX、新しいプロセスの最大パラメータ長ARG_MAXUbuntu 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と指定されています。でも、次のように接続されます。子コミット責任がある。

関連情報