Lösung 1:
Sie müssen in 00
suchen (oder eine der darin enthaltenen Dateien, z. B. 17
unter OS X) für 27
von 34
.
Die neuesten Betriebssysteme (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) können bis zu zwei Milliarden (42
), also würde ich davon ausgehen und eine Problemumgehung für die obskureren Systeme vornehmen, die dies nicht tun.
Lösung 2:
glibc stellt Definitionen für all diese Systemtypen bereit.
Sie können 57
überprüfen :
% grep UID_T /usr/include/bits/typesizes.h
#define __UID_T_TYPE __U32_TYPE
Als nächstes sehen Sie sich 61
an :
% grep '#define __U32_TYPE' /usr/include/bits/types.h
#define __U32_TYPE unsigned int
Auf diese Weise können Sie den C-Typ ermitteln. Da Sie die Größe in Bytes benötigen, parsen Sie am besten den Typedef-Namen gemäß der Spezifikation in 74
:
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
Also, hier ist ein Einzeiler:
% grep '#define __UID_T_TYPE' /usr/include/bits/typesizes.h | cut -f 3 | sed -r 's/__([US])([^_]*)_.*/\1 \2/'
U 32
Hier 86
bedeutet 93
(dies kann auch 106
sein für 113
) und 124
ist die Größe (sehen Sie sie in der obigen Liste nach; ich denke, meistens können Sie davon ausgehen, dass dies bereits die Größe in Bytes ist, aber wenn Sie möchten, dass Ihr Skript vollständig portabel ist, ist es möglicherweise besser, 139
Lösung 3:
In diesem Link wird die Frage gestellt, und ein Antwortender verwendet eine Trial-and-Error-Methode, um festzustellen, dass das betreffende System eine vorzeichenbehaftete lange Ganzzahl verwendet, wobei 31 Bits verbleiben, um den Wert zu speichern, mit einem Maximum von 2.147.483.647.
# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
Lösung 4:
Das ist eine interessante Frage. Ich wäre überrascht, wenn es eine tragbare Standardmethode gäbe, um dies zu bestimmen.
Ich habe keine Linux-Box zur Hand, aber die 147
Befehl unter FreeBSD 8.0 springt auf Null zurück:
# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
Ich bin mir sicher, dass dies ein undefiniertes Verhalten ist, aber ich würde wetten, dass die meisten Versionen von 156
würde entweder mit 165
auf Null umbrechen (bei 16-Bit-UID) und 179
oder Fehler aus, wenn Sie die Systemgrenze überschritten haben.