Entiendo que las ID de usuario (UID) de Unix suelen ser enteros sin signo de 16 o 32 bits, pero ¿cómo puedo encontrar un sistema determinado (en un shell)?
18
Usted tendrá que buscar en <limits.h>(o uno de los archivos que incluye, por ejemplo, sys/syslimits.hen OS X) para el #definede UID_MAX.
Los sistemas operativos más recientes (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) pueden manejar hasta dos mil millones ( 2^31-2), por lo que asumiría eso y haría una solución para los sistemas más oscuros que no 't.
UID_MAX. Por ejemplo, herramientas deshadow-utilsuso(uid_t)-1para averiguar el valor máximo para UID.login.defsindica que, en ese contexto,UID_MAXsolo controla el uid más alto que se asignará automáticamente a los nuevos usuarios creados conuseradd.glibc proporciona definiciones para todos esos tipos de sistemas.
Puedes consultar
/usr/include/bits/typesizes.h:A continuación te fijas en
/usr/include/bits/types.h:Esto le permite descubrir el tipo C. Como necesita el tamaño en bytes, su mejor opción es analizar el nombre typedef de acuerdo con la especificación en
types.h:Entonces, aquí hay una frase:
Aquí
Usignificaunsigned(esto también puede serSparasigned) y32es el tamaño (búsquelo en la lista anterior; creo que, la mayoría de las veces, puede suponer que ya es tamaño en bytes, pero si desea que su script sea totalmente portátil, podría ser mejor hacercasecambiar este valor).fuente
/usr/include/$(gcc -print-multiarch)/bits/typesizes.ho alternativamente:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.hEsa es una pregunta interesante. Me sorprendería si hubiera un método estándar y portátil para determinar esto.
No tengo un cuadro de Linux a mano, pero el
idcomando en FreeBSD 8.0 vuelve a cero:Estoy seguro de que este es un comportamiento indefinido, pero apostaría a que la mayoría de las versiones
idse ajustarán a cero con65'536(si es un UID de 16 bits)4'294'967'296o se producirán errores si supera el límite del sistema.fuente
En este enlace, se hace la pregunta y un respondedor usa un método de prueba y error para determinar que el sistema en cuestión usa un int largo firmado, dejando 31 bits para almacenar el valor, con un máximo de 2,147,483,647.
fuente