Что такое канонический способ найти фактическую максимальную длину списка аргументов?

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? Кажется, это на самом деле длина аргументов в байтах (или, возможно, символах) с или без (?) Разделяющих пробелов. Если это действительно длина байта, есть ли другие ограничения ?

l0b0
источник

Ответы:

7

Да, это длина в байтах, включая окружение.

Очень грубо

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

Linux Sysconf

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

POSIX 2004 limit.h

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

Mikel
источник
3

На странице, на которую вы ARG_MAXссылались, говорится, что с версии ядра 2.6.23 она составляет 1/4 размера стека. Это даже ссылки на git commit ответственность.

bahamat
источник