ต่อไปนี้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 ผิดหรือเปล่า ดูเหมือนว่าที่จริงแล้วมันคือความยาวไบต์ (หรืออาจเป็นอักขระ) ของอาร์กิวเมนต์ที่มีหรือไม่มี (?) การแยกช่องว่าง ถ้าเป็นความยาวไบต์จริงๆมีข้อ จำกัด อื่นอีกไหม?