ARG_MAX에 이어 새로운 프로세스에 대한 최대 인수 길이는ARG_MAX
Ubuntu 12.04를 실행하는 Mac Mini 3,1에서 잘못 정의되었거나 적어도 모호하게 정의 된 것처럼 보입니다 .
$ 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) 이상이어야합니다.
환경 데이터를 포함하여 실행 함수에 대한 최대 인수 길이입니다. 허용되는 최소값 : {_POSIX_ARG_MAX}