Quelle est la manière canonique de trouver la longueur maximale réelle de la liste d'arguments?

9

Après ARG_MAX, la longueur maximale des arguments pour un nouveau processus semble être ARG_MAXincorrectement (ou du moins ambiguë) définie sur mon Mac Mini 3,1 exécutant 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

La limite réelle semble se situer quelque part entre ceux-ci:

$ 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

J'ai fait une petite recherche:

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

Finalement, cela a abouti à ARG_MAX = 314290, qui ne semble avoir aucune relation avec l'une des ARG_MAXvaleurs trouvées auparavant. Est-ce normal? Existe-t-il un moyen plus simple de trouver le réel ARG_MAX?

Ai-je mal compris la définition de ARG_MAX? Il semble que ce soit en fait la longueur en octets (ou éventuellement en caractères) des arguments avec ou sans (?) Les espaces de séparation. Si c'est vraiment la longueur d'octet, y a-t-il aussi d' autres restrictions ?

l0b0
la source

Réponses:

7

Oui, c'est la longueur en octets, y compris l'environnement.

Très grossièrement:

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

linux sysconf

La longueur maximale des arguments de la famille de fonctions exec (3). Ne doit pas être inférieur à _POSIX_ARG_MAX (4096).

POSIX 2004 limits.h

Longueur maximale d'argument pour les fonctions exec, y compris les données d'environnement. Valeur minimale acceptable: {_POSIX_ARG_MAX}

Mikel
la source
3

La page à laquelle vous avez lié about ARG_MAXindique qu'à partir de la version 2.6.23 du noyau, elle représente 1 / 4ème de la taille de la pile. Il est même lié au responsable git commit .

bahamat
la source