Qual è un modo canonico per trovare la lunghezza massima effettiva dell'elenco argomenti?


9

A seguito di ARG_MAX, la lunghezza massima degli argomenti per un nuovo processo sembra ARG_MAXerroneamente (o almeno ambiguamente) definita sul mio 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

Il limite effettivo sembra essere tra questi:

$ 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

Ho fatto una piccola ricerca:

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

Alla fine ciò ha comportato ARG_MAX = 314290, che non sembra avere alcuna relazione con nessuno dei ARG_MAXvalori trovati prima. È normale? C'è un modo più semplice per trovare l'attuale ARG_MAX?

Ho frainteso la definizione di ARG_MAX? Sembra che sia in realtà la lunghezza in byte (o forse il carattere) degli argomenti con o senza (?) Gli spazi di separazione. Se è davvero la lunghezza del byte, ci sono anche altre restrizioni ?

Risposte:


7

Sì, è la lunghezza in byte, incluso l'ambiente.

Molto approssimativamente:

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

Linux sysconf

La lunghezza massima degli argomenti per la famiglia di funzioni exec (3). Non deve essere inferiore a _POSIX_ARG_MAX (4096).

Limiti POSIX 2004.h

Lunghezza massima dell'argomento per le funzioni exec, inclusi i dati ambientali. Valore minimo accettabile: {_POSIX_ARG_MAX}


3

La pagina a cui ci si collega su ARG_MAXafferma che a partire dalla versione 2.6.23 del kernel è 1/4 della dimensione dello stack. Si collega anche al commit git responsabile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.