जवाबों:
इसके लिए आपको <limits.h>
(या इसमें शामिल फ़ाइलों में से एक, उदाहरण के लिए, sys/syslimits.h
OS X पर) देखने #define
की आवश्यकता होगी UID_MAX
।
सबसे हालिया ऑपरेटिंग सिस्टम (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) दो बिलियन ( 2^31-2
) तक संभाल सकता है , इसलिए मैं यह मानूंगा कि अधिक अस्पष्ट प्रणालियों के लिए एक वर्कअराउंड बनाएं। 'टी।
login.defs
इंगित करता है कि उस संदर्भ में, UID_MAX
केवल उच्चतम uid कि स्वचालित रूप से के साथ बनाया नए उपयोगकर्ताओं के लिए आवंटित किया जाएगा नियंत्रित करता है useradd
।
glibc उन सभी सिस्टम प्रकारों के लिए परिभाषा प्रदान करता है।
आप देख सकते हैं /usr/include/bits/typesizes.h
:
% grep UID_T /usr/include/bits/typesizes.h
#define __UID_T_TYPE __U32_TYPE
आगे आप देखिए /usr/include/bits/types.h
:
% grep '#define __U32_TYPE' /usr/include/bits/types.h
#define __U32_TYPE unsigned int
यह आपको C टाइप का पता लगाने देता है। चूंकि आपको बाइट्स में आकार की आवश्यकता होती है, इसलिए आपका सबसे अच्छा विकल्प विनिर्देश के अनुसार टाइप किए गए नाम को पार्स कर रहा है types.h
:
We define __S<SIZE>_TYPE and __U<SIZE>_TYPE for the signed and unsigned
variants of each of the following integer types on this machine.
16 -- "natural" 16-bit type (always short)
32 -- "natural" 32-bit type (always int)
64 -- "natural" 64-bit type (long or long long)
LONG32 -- 32-bit type, traditionally long
QUAD -- 64-bit type, always long long
WORD -- natural type of __WORDSIZE bits (int or long)
LONGWORD -- type of __WORDSIZE bits, traditionally long
तो, यहाँ एक लाइनर है:
% grep '#define __UID_T_TYPE' /usr/include/bits/typesizes.h | cut -f 3 | sed -r 's/__([US])([^_]*)_.*/\1 \2/'
U 32
यहां U
इसका मतलब है unsigned
(यह भी हो सकता S
है signed
) और 32
आकार है (इसे ऊपर की सूची में देखें; मुझे लगता है, ज्यादातर समय आप मान सकते हैं कि यह पहले से ही बाइट्स में आकार है, लेकिन अगर आप चाहते हैं कि आपकी स्क्रिप्ट पूरी तरह से पोर्टेबल हो। case
इस मूल्य पर स्विच करने के लिए बेहतर हो सकता है )।
/usr/include/$(gcc -print-multiarch)/bits/typesizes.h
या वैकल्पिक रूप से:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
यह एक दिलचस्प सवाल है। मुझे आश्चर्य होगा कि इसे निर्धारित करने के लिए एक मानक, पोर्टेबल विधि थी।
मेरे पास लिनक्स बॉक्स नहीं है, लेकिन id
FreeBSD 8.0 पर कमांड शून्य पर वापस आ जाती है:
# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
मुझे यकीन है कि यह अपरिभाषित व्यवहार है, लेकिन मैं चाहूंगा कि अधिकांश संस्करण id
या तो शून्य के साथ 65'536
(यदि 16-बिट यूआईडी) और 4'294'967'296
या त्रुटि से बाहर निकले, अगर आप सिस्टम सीमा से परे चले गए।
में इस लिंक प्रश्न पूछा जाता है और एक प्रत्युत्तर एक हस्ताक्षरित लंबे पूर्णांक सवाल उपयोग में प्रणाली निर्धारित करने के लिए एक परीक्षण और त्रुटि विधि का उपयोग करता है, 31 बिट छोड़ने 2,147,483,647 की एक अधिकतम के साथ, मान संग्रहीत।
# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
UID_MAX
। उदाहरण के लिए, यूआईडी के अधिकतम मूल्य का पता लगाने के लिएshadow-utils
उपयोग के उपकरण(uid_t)-1
।