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` はどのように決定されているのでしょうか？
CC BY-SA 4.0
2018-06-21T15:34:16.340
44966
2018-07-22T05:06:51.423
19110
question
linux kernel
ARG_MAX は何故必要？（あるいは、ARG_MAX はどう決まる？）
必要性ってことだと「コンピュータのメモリは有限だから」でしょう。特に UNIX の開発された頃１９７０～８０年代のメモリ容量はとても少なかった（
MicroVAX II のメモリ容量は 1MB ）ことを忘れてはいけません。

極端な例なら MS-DOS のコマンドラインは PSP (Program Segment Prefix) の offset 0x80
以後に配置される関連で最大長 127 文字です (offset 0x80 はコマンドライン長）

UNIX
の世界でも、今起動しようとしているこの１個のプロセスのコマンドラインを確保するためだけに残メモリを全て使ってしまうと他の起動済みプロセス全てに影響を及ぼしかねないので、制約を設けるのはとても合理的です。

数値がなぜこの値か、についてはウチの HPUX11.11 の `/usr/include/limits.h` には下記のようなコメントが入っています。

> The default values are provided here because the constants are specified by
> several publications including XPG (X/Open Portability Guide) Issue 2 and
> SVID (System V Interface Definition) Issue 2.  
>  `#define ARG_MAX 2048000` /* maximum length of arguments ... */

オイラ勝手訳

> ここで提供されているデフォルト値は XPG2 や SVID2 などの文書によって指定されている定数です。

理由なり根拠なりが説明されているとしたらこの辺の文書にありそうですが、今オイラに XPG2 や SVID2 を探す時間が無いのでその辺は他の人にお任せで。

シェルの組み込みコマンドの場合、メモリが許す限りコマンドライン引数をとっても「別プロセスを起動しないので」許されるとかそういう考えなのかもと邪推（裏づけなし）。
CC BY-SA 4.0
2018-06-22T00:37:20.860
44976
2018-06-22T00:37:20.860
8589
44966
answer
<http://man7.org/linux/man-pages/man2/execve.2.html>

> the total size is limited to 1/4 of the allowed stack size.

execveのmanに上のように書いてあります。  
実際手元で確認してみると確かにスタックの上限サイズの1/4となっているようです。  
(ulimitの出力はKiB単位のため*1024/4)

```

    $ ulimit -s
    8192
    $ getconf ARG_MAX
    2097152
    $ ulimit -s 4096
    $ ulimit -s
    4096
    $ getconf ARG_MAX
    1048576
    
```

またなぜ制限が必要かということについては、execveに限らず関数を呼ぶ時に引数はレジスタとスタックに積んで渡される事が関係するのではないでしょうか。  
もしその制限がないと過大な引数を渡された時にスタックが溢れてしまうからではないかと思いました。(自信ナシ)
CC BY-SA 4.0
2018-07-22T05:06:51.423
46825
2018-07-22T05:06:51.423
2020-06-17T08:14:45.997
-1
29409
44966
answer