উত্তর:
আপনি চেহারা করতে হবে <limits.h>
(, বা ফাইল এটা অন্তর্ভুক্ত, যেমন এক sys/syslimits.h
OS X এর দিকে) জন্য #define
এর UID_MAX
।
সর্বাধিক সাম্প্রতিক অপারেটিং সিস্টেমগুলি (সোলারিস ২.x, ওএস এক্স, বিএসডি, লিনাক্স, এইচপি-ইউএক্স ১১ আই, এআইএক্স)) দুই বিলিয়ন ( 2^31-2
) পর্যন্ত পরিচালনা করতে পারে , তাই আমি ধরে নিই এবং আরও অস্পষ্ট সিস্টেমগুলির জন্য একটি কার্যনির্বাহ তৈরি করব যা ডোন না 'টি।
login.defs
নির্দেশ করে যে সেই প্রসঙ্গে, UID_MAX
কেবলমাত্র সর্বাধিক ইউআইডি নিয়ন্ত্রণ করে যা তৈরি করা নতুন ব্যবহারকারীদের জন্য স্বয়ংক্রিয়ভাবে নির্ধারিত হবে 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
এটি আপনাকে সি ধরণের সন্ধান করতে দেয়। যেহেতু আপনার বাইটস আকারের প্রয়োজন তাই আপনার সর্বোত্তম বিকল্পটি স্পেসিফিকেশন অনুসারে টাইপডেফ নামটি পার্স করছে 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
ফ্রিবিএসডি 8.0- র কমান্ডটি শূন্যে ফিরে আসে:
# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
আমি নিশ্চিত যে এটি অনির্ধারিত আচরণ, তবে আমি বাজি রেখেছিলাম যে বেশিরভাগ সংস্করণটি id
হয় হয় শূন্যের জন্য 65'536
(যদি 16-বিট ইউআইডি) থাকে এবং 4'294'967'296
আপনি যদি সিস্টেমের সীমা ছাড়িয়ে যান তবে ত্রুটি হয়ে যায়।
ইন এই লিঙ্কে প্রশ্ন জিজ্ঞাসা করা হয় এবং উত্তর প্রদানকারী একটি স্বাক্ষরিত দীর্ঘ int- এ প্রশ্ন ব্যবহারসমূহ সিস্টেম নির্ধারণ করতে একটি ট্রায়াল & ত্রুটি পন্থাটি ব্যবহার করে, 31 বিট যাব 2.147.483.647 একটি সবের্াচ্চ সঙ্গে, মান সংরক্ষণ করতে।
# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
UID_MAX
। উদাহরণস্বরূপ, ইউআইডির সর্বাধিক মান সন্ধান করার জন্যshadow-utils
ব্যবহৃত সরঞ্জামগুলি(uid_t)-1
।