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_MAX
là 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_MAX
giá 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?