วิธีบัญญัติมาตรฐานเพื่อค้นหาความยาวรายการอาร์กิวเมนต์สูงสุดจริงคืออะไร


9

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

คำตอบ:


7

ใช่ความยาวเป็นไบต์รวมถึงสภาพแวดล้อมด้วย

อย่างเกรี้ยวกราด:

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

linux sysconf

ความยาวสูงสุดของการขัดแย้งกับฟังก์ชันตระกูล exec (3) ต้องไม่น้อยกว่า _POSIX_ARG_MAX (4096)

POSIX 2004 ขีด จำกัด

อาร์กิวเมนต์ความยาวสูงสุดของฟังก์ชัน exec รวมถึงข้อมูลสภาพแวดล้อม ค่าต่ำสุดที่ยอมรับได้: {_POSIX_ARG_MAX}


3

เพจที่คุณเชื่อมโยงไปถึงเกี่ยวกับARG_MAXสถานะที่เป็นของเคอร์เนลรุ่น 2.6.23 มันเป็น 1 / 4th ขนาดสแต็ก มันยังเชื่อมโยงไปยังคอมไพล์รับผิดชอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.