O que é uma maneira canônica de encontrar o comprimento real da lista de argumentos máxima?

9

Seguindo ARG_MAX, comprimento máximo de argumentos para um novo processo , parece que ARG_MAX é erroneamente (ou pelo menos ambiguamente) definido no meu Mac Mini 3.1 rodando o Ubuntu 12.04:

$ getconf ARG_MAX # arguments 
2097152
$ locate limits.h | xargs grep -ho 'ARG_MAX[ \t]\+[0-9]\+' | uniq | cut -d ' ' -f 8
131072

O limite real parece estar em algum lugar entre estes:

$ 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

Eu fiz uma pequena pesquisa:

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

Eventualmente, isso resultou em ARG_MAX = 314290 , o que não parece ter relação com nenhum dos valores de ARG_MAX encontrados anteriormente. Isso é normal? Existe uma maneira mais simples de encontrar o% realARG_MAX?

Eu entendi mal a definição de ARG_MAX? Parece que, na verdade, é o byte (ou possivelmente o caractere ) comprimento dos argumentos com ou sem (?) os espaços de separação. Se é realmente o tamanho do byte, existem também outras restrições ?

    
por l0b0 09.08.2012 / 17:03

2 respostas

6

Sim, é o tamanho em bytes, incluindo o ambiente.

Aproximadamente:

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

sysconf do linux

The maximum length of the arguments to the exec(3) family of functions. Must not be less than _POSIX_ARG_MAX (4096).

POSIX 2004 limits.h

Maximum length of argument to the exec functions including environment data. Minimum Acceptable Value: {_POSIX_ARG_MAX}

    
por 09.08.2012 / 21:40
3

A página que você vinculou a ARG_MAX indica que, a partir da versão 2.6 do kernel .23 é 1/4 do tamanho da pilha. Ele até vincula-se ao git commit responsável.

    
por 09.08.2012 / 19:38