Was ist ein kanonischer Weg, um die tatsächliche maximale Länge der Argumentliste zu ermitteln?

9

Nach ARG_MAX, maximale Länge der Argumente für ein neues Verfahren , wie es scheint , ARG_MAXist falsch (oder zumindest zweideutig) auf meinem Mac Mini 3,1 Ubuntu 12.04 definiert:

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

Die tatsächliche Grenze scheint irgendwo zwischen diesen zu liegen:

$ 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

Ich habe eine kleine Suche durchgeführt:

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

Letztendlich führte dies zu ARG_MAX = 314290einer Beziehung, die mit keinem der ARG_MAXzuvor gefundenen Werte in Beziehung zu stehen scheint . Ist das normal? Gibt es einen einfacheren Weg, um das tatsächliche zu finden ARG_MAX?

Habe ich die Definition von ARG_MAX falsch verstanden? Es scheint tatsächlich die Bytelänge (oder möglicherweise die Zeichenlänge) der Argumente mit oder ohne (?) Die Trennzeichen zu sein. Wenn es wirklich die Bytelänge ist, gibt es auch andere Einschränkungen ?

l0b0
quelle

Antworten:

7

Ja, es ist die Länge in Bytes, einschließlich der Umgebung.

Sehr grob:

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

Linux Sysconf

Die maximale Länge der Argumente für die Funktionsfamilie exec (3). Darf nicht kleiner als _POSIX_ARG_MAX (4096) sein.

POSIX 2004 Limits.h

Maximale Argumentationsdauer für die exec-Funktionen einschließlich Umgebungsdaten. Zulässiger Mindestwert: {_POSIX_ARG_MAX}

Mikel
quelle
3

Die Seite, auf die Sie ungefähr verlinkt haben, ARG_MAXgibt an, dass es ab Kernel-Version 2.6.23 1/4 der Stapelgröße ist. Es verlinkt sogar auf das verantwortliche Git Commit .

Bahamat
quelle