Відповіді:
Ви повинні дивитися в <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.