실제 최대 매개변수 목록 길이를 찾는 표준적인 방법은 무엇입니까?

실제 최대 매개변수 목록 길이를 찾는 표준적인 방법은 무엇입니까?

다음과 같은ARG_MAX, 새 프로세스의 최대 매개변수 길이ARG_MAXUbuntu 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)보다 작을 수 없습니다.

POSIX 2004 제한사항.h

환경 데이터를 포함하여 exec 함수에 대한 인수의 최대 길이입니다. 허용되는 최소값: {_POSIX_ARG_MAX}

답변2

당신이 링크한 페이지는 대략ARG_MAX커널 버전 2.6.23 기준으로 스택 크기는 1/4이라고 명시되어 있습니다. 심지어는 다음과 연결됩니다.자식 커밋책임이 있는.

관련 정보