वास्तविक अधिकतम तर्क सूची की लंबाई खोजने के लिए एक विहित तरीका क्या है?


9

ARG_MAX के बाद , एक नई प्रक्रिया के लिए तर्कों की अधिकतम लंबाई, ऐसा लगता है ARG_MAXकि गलत है (या कम से कम अस्पष्ट रूप से) मेरे मैक मिनी 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

कार्यों के निष्पादन (3) परिवार के लिए तर्कों की अधिकतम लंबाई। _POSIX_ARG_MAX (4096) से कम नहीं होना चाहिए।

POSIX 2004 की सीमा। एच

पर्यावरण डेटा सहित निष्पादन कार्यों के लिए तर्क की अधिकतम लंबाई। न्यूनतम स्वीकार्य मूल्य: {_POSIX_ARG_MAX}


3

आपके द्वारा लिंक किए गए पृष्ठ में ARG_MAXबताया गया है कि कर्नेल संस्करण 2.6.23 के रूप में यह स्टैक आकार का 1 / 4th है। यह भी करने के लिए लिंक Git प्रतिबद्ध जिम्मेदार।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.