Я понимаю, что пользовательские идентификаторы Unix (UID), как правило, представляют собой 16- или 32-разрядные целые числа без знака, но как я могу узнать это для любой системы (в оболочке)?
18
Вам нужно будет найти <limits.h>
(или один из включенных в него файлов, например, sys/syslimits.h
в OS X) на предмет #define
of UID_MAX
.
Самые последние операционные системы (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) могут обрабатывать до двух миллиардов ( 2^31-2
), поэтому я предположил бы это и сделал обходной путь для более неясных систем, которые «т.
UID_MAX
. Например, инструменты изshadow-utils
использования,(uid_t)-1
чтобы узнать максимальное значение для UID.login.defs
указывает , что в этом контексте,UID_MAX
контролирует только высокий идентификатор пользователя, который будет автоматически назначена для новых пользователей , созданных сuseradd
.glibc предоставляет определения для всех этих типов систем.
Вы можете проверить
/usr/include/bits/typesizes.h
:Далее вы смотрите в
/usr/include/bits/types.h
:Это позволяет вам узнать тип C. Поскольку вам нужен размер в байтах, лучшим вариантом будет разбор имени typedef в соответствии со спецификацией в
types.h
:Итак, вот одна строка:
Здесь
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
либо обернутся в ноль с65'536
(если 16-битный UID), либо произойдет4'294'967'296
ошибка, если вы выйдете за пределы системы.источник
В этой ссылке задается вопрос, и респондент использует метод проб и ошибок, чтобы определить, что рассматриваемая система использует длинное целое со знаком, оставляя 31 бит для хранения значения, с максимальным значением 2 147 483 647.
источник