Linux では、制限はARG_MAX
(で照会できますgetconf ARG_MAX
) です。私はカーネルの制限を編集する習慣があります (たとえば、制限linux-3.7.1/include/uapi/linux/limits.h
を増やすために)。
( setrlimit(2) RLIMIT_STACK
は実際にはプログラム引数の最大サイズを小さくするかもしれないことに注意してください)
一部の Linux カーネル (特に古い、または組み込み) には下限があります。おそらく 32768 まで下げる準備をしておく必要があります (私自身のカーネルでは 2097152 に上げています)。
私が育てている理由ARG_MAX
は、十分な RAM (16G バイト) があり、シェルがあり、必要なときにzsh
入力**/*.c
するのが好きだからです (したがって、.find
execve(2) Linux man ページと Posix execドキュメントを読んでください。Linux のマニュアル ページには、引数と環境のサイズの制限に関するいくつかの段落があります。
Windows (または少なくとも MS-DOS) では、(拡張前に) 128 まで低くなる場合があります。
また、引数の展開は (Posix および Linux システムでは) シェルによって行われ、system(3)とその名前の Perl の関数はおそらく/bin/sh -c
展開を行う a を開始していることを理解する必要があります。重要なのは、展開された引数リストのサイズです。したがって、展開されていないコマンドライン が非常に短い場合でも、呼び出して 100 万個の引数に展開されたsystem("ls */*/*.c")
場合*/*/*.c
、問題が発生します (少なくとも Posix と Linux では) 。ls */*/*.c
Windows と MS-DOS では、ランタイム ライブラリがコマンド ラインを引数リストに展開すると噂されています。プログラムは端末コマンドが解釈されずに開始され、実行時の起動処理が展開を行っていると聞きました。
あなたの質問に答えるために: Posix システムでは、拡張された引数リストが重要であり、その拡張された引数リストが 32K バイトよりも小さい場合、おそらく非常に安全です (実際には 128K バイトで十分です)。Windows または MS-DOS (私はそう推測しています) では、展開されていないコマンド ラインを 128 文字に制限し、その展開を 64K バイトに制限する必要があります (実際には、より大きなしきい値でうまくいくことがよくあります)。の結果を常にテストする必要があると本当に思いますsystem