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 की परिभाषा गलत लगी? ऐसा लगता है कि यह वास्तव में अलग-अलग स्थानों के साथ या (?) तर्कों की बाइट (या संभवतः चरित्र) लंबाई है। यदि यह वास्तव में बाइट की लंबाई है, तो क्या अन्य प्रतिबंध भी हैं ?