Який канонічний спосіб знайти фактичну максимальну довжину списку аргументів?


9

Після ARG_MAX максимальна довжина аргументів для нового процесу, схоже ARG_MAX, неправильно (або принаймні неоднозначно) визначена в моєму Mac Mini 3,1 під керуванням 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

Здається, фактична межа знаходиться десь між цими:

$ 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

Я здійснив невеликий пошук:

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

Врешті-решт це призвело до того ARG_MAX = 314290, що, схоже, не має жодного відношення до жодного зі ARG_MAXзначень, знайдених раніше. Це нормально? Чи є більш простий спосіб знайти фактичне ARG_MAX?

Чи я неправильно зрозумів визначення ARG_MAX? Здається, це фактично довжина байтів (або можливо символів) аргументів з роздільними пробілами або без них (?). Якщо це дійсно довжина байтів, чи існують також інші обмеження ?

Відповіді:


7

Так, це довжина в байтах, включаючи середовище.

Дуже приблизно:

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

Linux sysconf

Максимальна довжина аргументів до сімейства функцій exec (3). Має бути не менше _POSIX_ARG_MAX (4096).

POSIX 2004 обмеження.h

Максимальна тривалість аргументу до функцій exec, включаючи дані середовища. Мінімальне прийнятне значення: {_POSIX_ARG_MAX}


3

Сторінка, на яку ви пов’язані, ARG_MAXговорить про те, що для версії ядра 2.6.23 вона становить 1/4 розміру стека. Він навіть посилається на відповідальну відповідальність за git .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.