ARG_MAX は何故必要?(あるいは、ARG_MAX はどう決まる?)
Linux では、シェルでコマンドに渡す引数の数に上限があります。たとえばたくさんのファイルに対して foobar *
のようにコマンドを実行しようとして Argument list too long
エラーが出たならば、原因はこれです。
簡単に調べた所、この上限は ARG_MAX
として定義されているようです。私の Ubuntu (64bit) 環境では、以下の値になっていました。
$ getconf ARG_MAX
2097152
この ARG_MAX
については、man 3 sysconf
に以下の通り説明されていました。
ARG_MAX - _SC_ARG_MAX
The maximum length of the arguments to the exec(3) family of
functions. Must not be less than _POSIX_ARG_MAX (4096).
この説明に従うと、引数長の上限は exec
系のシステムコールに渡す引数の関係で生まれているように見えます。しかし、一体どういう限界が上限を生んでいるのでしょうか?
実際の ARG_MAX
の値を見るに、そこまで大きな値ではありません。私の環境では ARG_MAX
がちょうど 2²¹ に等しいので何かしら訳があってこの値になっているのだと思いますが、何故この値になっているのかが分かりません。
また、ARG_MAX
による引数長の制限は echo
などのシェル組み込みコマンドにはありません。つまりこの上限は引数そのものを管理する際に現れる限界ではなく、exec
をする際の何らかの限界によってもたらされているものだと思うのですが、そこから先が分かりません。
そこで、質問です。
質問
- シェルコマンドに渡す引数長の上限は、何故必要なのでしょうか?
- 特に、
ARG_MAX
はどのように決定されているのでしょうか?