引数リストの実際の最大長を見つけるための標準的な方法は何ですか?


9

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

回答:


7

はい、それは環境を含むバイト単位の長さです。

大まかに:

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

Linux sysconf

exec(3)関数ファミリーの引数の最大長。_POSIX_ARG_MAX(4096)以上でなければなりません。

POSIX 2004の制限.h

環境データを含むexec関数への引数の最大長。最小許容値:{_POSIX_ARG_MAX}


3

リンクしたページにARG_MAXは、カーネルバージョン2.6.23以降、スタックサイズの1/4と記載されています。責任のあるgit commitにもリンクしています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.