실제 최대 인수 목록 길이를 찾는 정식 방법은 무엇입니까?


9

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의 정의를 잘못 이해 했습니까? 실제로 공백이 있거나없는 (?) 인수 의 바이트 길이 (또는 문자 길이) 인 것 같습니다 . 실제로 바이트 길이라면 다른 제한 사항이 있습니까?

답변:


7

예, 환경을 포함한 길이는 바이트 단위입니다.

매우 대략 :

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

리눅스 sysconf

exec (3) 계열 함수에 대한 인수의 최대 길이입니다. _POSIX_ARG_MAX (4096) 이상이어야합니다.

POSIX 2004 limits.h

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


3

링크 된 페이지 ARG_MAX는 커널 버전 2.6.23부터 스택 크기의 1/4임을 나타 냅니다. 심지어 책임있는 커밋에 연결됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.