Apa cara kanonik untuk menemukan panjang daftar argumen maksimum yang sebenarnya?


9

Mengikuti ARG_MAX, panjang maksimum argumen untuk proses baru yang sepertinya ARG_MAXsalah (atau setidaknya ambigu) didefinisikan pada Mac Mini 3,1 saya yang menjalankan 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

Batas aktual tampaknya berada di antara:

$ 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

Saya melakukan pencarian kecil:

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

Akhirnya ini menghasilkan ARG_MAX = 314290, yang tampaknya tidak memiliki hubungan dengan salah satu ARG_MAXnilai yang ditemukan sebelumnya. Apakah ini normal? Apakah ada cara yang lebih sederhana untuk menemukan yang sebenarnya ARG_MAX?

Apakah saya salah memahami definisi ARG_MAX? Tampaknya itu sebenarnya byte (atau mungkin karakter) panjang argumen dengan atau tanpa (?) Ruang pemisah. Jika benar-benar panjang byte, apakah ada batasan lain ?

Jawaban:


7

Ya, itu panjang dalam byte, termasuk lingkungan.

Sangat kasar:

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

linux sysconf

Panjang maksimal argumen ke keluarga fungsi exec (3). Tidak boleh kurang dari _POSIX_ARG_MAX (4096).

POSIX 2004 Limit.h

Panjang maksimal argumen ke fungsi exec termasuk data lingkungan. Nilai Minimum yang Dapat Diterima: {_POSIX_ARG_MAX}


3

Halaman yang Anda tautkan tentang ARG_MAXmenyatakan bahwa pada kernel versi 2.6.23 itu adalah 1/4 ukuran stack. Bahkan tautan ke git commit bertanggung jawab.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.