Một cách chính tắc để tìm độ dài danh sách đối số tối đa thực tế là gì?


9

Theo ARG_MAX, độ dài tối đa của các đối số cho một quy trình mới có vẻ như ARG_MAXlà sai (hoặc ít nhất là mơ hồ) được xác định trên Mac Mini 3,1 của tôi chạy 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

Giới hạn thực tế dường như nằm ở đâu đó giữa:

$ 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

Tôi đã làm một tìm kiếm nhỏ:

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

Cuối cùng, điều này dẫn đến ARG_MAX = 314290, dường như không có bất kỳ mối quan hệ nào với một trong các ARG_MAXgiá trị được tìm thấy trước đó. Điều này có bình thường không? Có một cách đơn giản hơn để tìm thấy thực tế ARG_MAX?

Tôi đã hiểu sai định nghĩa của ARG_MAX? Có vẻ như đó thực sự là độ dài byte (hoặc có thể là ký tự) của các đối số có hoặc không có (?) Các khoảng cách phân tách. Nếu đó thực sự là độ dài byte, thì còn có những hạn chế nào khác không?

Câu trả lời:


7

Vâng, đó là độ dài tính bằng byte, bao gồm cả môi trường.

Rất khó khăn:

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

hệ thống linux

Độ dài tối đa của các đối số cho họ hàm exec (3). Không được nhỏ hơn _POSIX_ARG_MAX (4096).

Giới hạn POSIX 2004.h

Độ dài tối đa của đối số cho các hàm exec bao gồm dữ liệu môi trường. Giá trị tối thiểu chấp nhận được: {_POSIX_ARG_MAX}


3

Trang mà bạn đã liên kết với khoảng ARG_MAXcác trạng thái kể từ phiên bản kernel 2.6.23 là 1/4 kích thước ngăn xếp. Nó thậm chí liên kết đến cam kết git chịu trách nhiệm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.