¿Cuál es una forma canónica de encontrar la longitud máxima real de la lista de argumentos?

9

Después de ARG_MAX, la longitud máxima de argumentos para un nuevo proceso que parece estar ARG_MAXmal (o al menos ambiguamente) definida en mi Mac Mini 3,1 con 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

El límite real parece estar entre estos:

$ 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

Hice una pequeña búsqueda:

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

Finalmente, esto resultó en ARG_MAX = 314290, lo que no parece tener ninguna relación con ninguno de los ARG_MAXvalores encontrados anteriormente. ¿Esto es normal? ¿Hay una manera más simple de encontrar lo real ARG_MAX?

¿Entendí mal la definición de ARG_MAX? Parece que en realidad es la longitud del byte (o posiblemente el carácter) de los argumentos con o sin (?) Los espacios de separación. Si realmente es la longitud del byte, ¿existen otras restricciones ?

l0b0
fuente

Respuestas:

7

Sí, es la longitud en bytes, incluido el entorno.

Muy a grandes rasgos:

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

linux sysconf

La longitud máxima de los argumentos a la familia de funciones exec (3). No debe ser inferior a _POSIX_ARG_MAX (4096).

POSIX 2004 límites.h

Longitud máxima de argumento para las funciones ejecutivas, incluidos los datos del entorno. Valor mínimo aceptable: {_POSIX_ARG_MAX}

Mikel
fuente
3

La página a la que se vinculó acerca de ARG_MAXafirma que a partir de la versión 2.6.23 del núcleo es 1 / 4to del tamaño de la pila. Incluso se vincula con el responsable de git commit .

bahamat
fuente