2

発行されるコマンドの数を減らすために、perl ステートメントにできるだけ多くの文字を入れる必要があります。

system("$cmd_and_parameters")

Windows と Linux の両方で想定できる (安全な) 最大行の長さは?

私の質問は、適切な perl モジュールを使用せずに、Oetiker の「rrdtool スイート」のコマンドを発行する必要があるためです(これについて私を責めないでください)。

私の最初の試みは、前述の機能、設定を使用することでした

$cmd_and_parameters = "path_to_rrdtool/rrdtool update $db $timestamp:$value" 

動作しますが、私がしなければならない更新の数を考えると遅いです。

そこで、「rrdtool update」で許可されているので、「システム」呼び出しの数を減らして、引数の数を許可されている最大数まで増やすことにしました。

合理的な少数の引数を使用すると、はるかにうまく機能し、とにかく私のニーズには十分ですが、「システム関数に $timestamp:$value のペアをいくつ配置できるか?」という疑問が残ります。

つまり、perl システム関数には何文字まで入力できますか?

4

2 に答える 2

10

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

于 2013-01-05T20:37:18.400 に答える
2

Basile は、Linux の回答に対してほぼ最終的に回答しています。

Windows NT および関連バージョン (Windows 95、98、または ME ではないことを意味します。コマンド名を含めて 128 文字に制限されていると思います) には、2047 文字または 8191 文字のコマンド ラインがあります。 http://support.microsoft.com/kb/830473

古いバージョン (12 年以上前) の Windows を本当にサポートする必要がない限り、2KB からわずかな値を引いた値で問題ありません。

于 2013-01-05T23:03:37.983 に答える