Gerçek maksimum bağımsız değişken listesi uzunluğunu bulmanın standart yolu nedir?


9

ARG_MAX'ın ardından ,ARG_MAX Ubuntu 12.04 çalıştıran Mac Mini 3,1 cihazımda yanlış (veya en azından belirsiz olarak) görünen yeni bir işlem için maksimum bağımsız değişken uzunluğu tanımlandı:

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

Gerçek sınır, bunlar arasında bir yerde görünüyor:

$ 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

Küçük bir arama yaptım:

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

Sonuçta bu ARG_MAX = 314290, daha ARG_MAXönce bulunan değerlerden hiçbiriyle ilişkili olmadığı görülmüştür . Bu normal mi? Gerçek olanı bulmanın daha basit bir yolu var mı ARG_MAX?

ARG_MAX tanımını yanlış mı anladım? Görünüşe göre bu , ayırma boşlukları olan veya olmayan (?) Argümanların bayt (veya muhtemelen karakter) uzunluğudur. Gerçekten bayt uzunluğu ise, başka kısıtlamalar da var mı?

Yanıtlar:


7

Evet, çevre dahil bayt cinsinden uzunluk.

Çok kabaca:

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

linux sysconf

Exec (3) işlev ailesine ilişkin argümanların maksimum uzunluğu. _POSIX_ARG_MAX (4096) değerinden daha az olmamalıdır.

POSIX 2004 sınırları. H

Ortam verileri de dahil olmak üzere exec işlevlerine yönelik maksimum bağımsız değişken uzunluğu. Kabul Edilebilir Minimum Değer: {_POSIX_ARG_MAX}


3

Hakkında bağlandığınız sayfa ARG_MAX, çekirdek 2.6.23 sürümünden itibaren yığın boyutunun 1/4 olduğunu belirtir. Hatta git sorumlusu ile de bağlantı kuruyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.