Jaki jest kanoniczny sposób znalezienia faktycznej maksymalnej długości listy argumentów?

9

Zgodnie z ARG_MAX maksymalna długość argumentów dla nowego procesu , jak się wydaje, ARG_MAXjest niepoprawnie (lub przynajmniej dwuznacznie) zdefiniowana na moim komputerze Mac Mini 3,1 z systemem 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

Rzeczywisty limit wydaje się być gdzieś pomiędzy tymi:

$ 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

Przeprowadziłem małe wyszukiwanie:

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

Ostatecznie to spowodowało ARG_MAX = 314290, że wydaje się, że nie ma żadnego związku z żadną z ARG_MAXwcześniej znalezionych wartości. Czy to normalne? Czy istnieje prostszy sposób na znalezienie rzeczywistego ARG_MAX?

Czy źle zrozumiałem definicję ARG_MAX? Wygląda na to, że jest to długość bajtu (lub znaku) argumentów z lub bez (?) Spacji oddzielających. Jeśli to naprawdę długość bajtu, czy istnieją jeszcze inne ograniczenia ?

l0b0
źródło

Odpowiedzi:

7

Tak, jest to długość w bajtach, łącznie ze środowiskiem.

Bardzo z grubsza:

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

linux sysconf

Maksymalna długość argumentów w rodzinie funkcji exec (3). Nie może być mniejsza niż _POSIX_ARG_MAX (4096).

Limity POSIX 2004. h

Maksymalna długość argumentu funkcji exec, w tym danych środowiska. Minimalna dopuszczalna wartość: {_POSIX_ARG_MAX}

Mikel
źródło
3

Strona, do której prowadziłeś link, ARG_MAXmówi, że od wersji jądra 2.6.23 ma rozmiar 1/4 stosu. To nawet prowadzi do odpowiedzialnego zatwierdzenia git .

bahamat
źródło