Limit
找到實際最大參數列表長度的規範方法是什麼?
在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
exec(3) 系列函式的參數的最大長度。不得小於 _POSIX_ARG_MAX (4096)。
exec 函式的最大參數長度,包括環境數據。可接受的最小值:{_POSIX_ARG_MAX}
您連結到的頁面說明
ARG_MAX
從核心版本 2.6.23 開始,它是堆棧大小的 1/4。它甚至連結到負責的git commit。