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.h
en OS X) para el #define
de 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-utils
uso(uid_t)-1
para averiguar el valor máximo para UID.login.defs
indica que, en ese contexto,UID_MAX
solo 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í
U
significaunsigned
(esto también puede serS
parasigned
) y32
es 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 hacercase
cambiar este valor).fuente
/usr/include/$(gcc -print-multiarch)/bits/typesizes.h
o alternativamente:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
Esa 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
id
comando 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
id
se ajustarán a cero con65'536
(si es un UID de 16 bits)4'294'967'296
o 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