Qual é uma maneira canônica de encontrar o tamanho máximo real da lista de argumentos?

9

Seguindo ARG_MAX, o tamanho máximo de argumentos para um novo processo parece ARG_MAXestar errado (ou pelo menos ambíguo) definido no meu Mac Mini 3,1 executando 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 parece não ter nenhuma relação com nenhum dos ARG_MAXvalores encontrados anteriormente. Isso é normal? Existe uma maneira mais simples de encontrar o real ARG_MAX?

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

l0b0
fonte

Respostas:

7

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

Muito aproximadamente:

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

linux sysconf

O comprimento máximo dos argumentos para a família de funções exec (3). Não deve ser inferior a _POSIX_ARG_MAX (4096).

Limites POSIX 2004.h

Comprimento máximo de argumento para as funções exec, incluindo dados do ambiente. Valor mínimo aceitável: {_POSIX_ARG_MAX}

Mikel
fonte
3

A página que você vinculou ARG_MAXafirma que, a partir da versão 2.6.23 do kernel, é 1/4 do tamanho da pilha. Até vincula-se ao git commit responsável.

bahamat
fonte