Limit

找到實際最大參數列表長度的規範方法是什麼?

  • August 9, 2012

在ARG_MAX 之後,在我的執行 Ubuntu 12.04 的 Mac Mini 3,1 上似乎錯誤地(或至少模棱兩可地)定義了新程序的最大參數長度:ARG_MAX

$ 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 的定義嗎?看起來它實際上是帶有或不帶有(?)分隔空格的參數的字節(或可能是字元)長度。如果真的是字節長度,還有其他限制嗎?

是的,它是以字節為單位的長度,包括環境。

非常粗略:

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

linux系統配置

exec(3) 系列函式的參數的最大長度。不得小於 _POSIX_ARG_MAX (4096)。

POSIX 2004 限制.h

exec 函式的最大參數長度,包括環境數據。可接受的最小值:{_POSIX_ARG_MAX}

您連結到的頁面說明ARG_MAX從核心版本 2.6.23 開始,它是堆棧大小的 1/4。它甚至連結到負責的git commit

引用自:https://unix.stackexchange.com/questions/45143