Rozumiem, że uniksowe identyfikatory użytkowników (UID) to zwykle 16 lub 32-bitowe liczby całkowite bez znaku, ale jak mogę się dowiedzieć dla dowolnego systemu (w powłoce)?
18
Musisz spojrzeć na <limits.h>
(lub w jednym z plików to obejmuje, np sys/syslimits.h
na OS X) dla #define
o UID_MAX
.
Najnowsze systemy operacyjne (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) mogą obsłużyć do dwóch miliardów ( 2^31-2
), więc zakładam, że to zrobię i obejdę bardziej niejasne systemy, które nie „t.
UID_MAX
. Na przykład, narzędzia zshadow-utils
użycia(uid_t)-1
, aby dowiedzieć się maksymalną wartość dla UID.login.defs
wskazuje, że w tym kontekścieUID_MAX
kontroluje tylko najwyższy identyfikator użytkownika, który zostanie automatycznie przypisany dla nowych użytkowników utworzonych za pomocąuseradd
.glibc zawiera definicje wszystkich typów systemów.
Możesz sprawdzić
/usr/include/bits/typesizes.h
:Następnie zajrzyj do
/usr/include/bits/types.h
:Pozwala to znaleźć typ C. Ponieważ potrzebujesz rozmiaru w bajtach, najlepszą opcją jest parsowanie nazwy typedef zgodnie ze specyfikacją w
types.h
:Oto jedna linijka:
Oto
U
sposobyunsigned
(może to być równieżS
nasigned
) i32
jest wielkości (szukać go na powyższej liście, myślę, przez większość czasu można założyć, że to już rozmiar w bajtach, ale jeśli chcesz, aby Twój scenariusz jest w pełni przenośny to może być lepszecase
włączenie tej wartości).źródło
/usr/include/$(gcc -print-multiarch)/bits/typesizes.h
lub alternatywnie:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
To interesujące pytanie. Byłbym zaskoczony, gdyby istniała standardowa, przenośna metoda ustalenia tego.
Nie mam pod ręką Linux-a, ale
id
polecenie FreeBSD 8.0 wraca do zera:Jestem pewien, że jest to niezdefiniowane zachowanie, ale
id
postawiłbym na to, że większość wersji albo zawinie się do zera65'536
(jeśli 16-bitowy UID),4'294'967'296
albo popełni błąd, jeśli przekroczysz limit systemu.źródło
W tym łączu zadawane jest pytanie, a respondent używa metody prób i błędów, aby ustalić, że dany system używa podpisanej długiej int, pozostawiając 31 bitów do przechowywania wartości, z maksimum 2 147 483 647.
źródło