다음과 같은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의 정의를 오해했나요? 실제로는 이런 것 같네요바이트(또는 문자) 구분 공백이 있거나 없는 인수의 길이입니다. 실제로 바이트 단위의 길이라면 다른 것이 있습니까?기타 제한사항?
답변1
예, 환경을 포함한 길이(바이트)입니다.
대략적으로:
$ { seq 1 314290; env; } | wc -c
2091391
exec(3) 함수 시리즈에 대한 매개변수의 최대 길이입니다. _POSIX_ARG_MAX(4096)보다 작을 수 없습니다.
환경 데이터를 포함하여 exec 함수에 대한 인수의 최대 길이입니다. 허용되는 최소값: {_POSIX_ARG_MAX}