Відповіді:
Ви повинні дивитися в <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контролює тільки високий ідентифікатор користувача, який буде автоматично призначена для нових користувачів , створених з 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. Оскільки вам потрібен розмір у байтах, ваш найкращий варіант - аналіз імені typedef відповідно до специфікації у 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
Це цікаве питання. Я був би здивований, якби був стандартний, портативний метод для визначення цього.
У мене не зручна скринька Linux, але idкоманда на FreeBSD 8.0 повертається до нуля:
# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
Я впевнений, що це невизначена поведінка, але я б став до того, що більшість версій idабо завершиться до нуля 65'536(якщо 16-бітний UID), 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для з'ясування максимального значення для UID.