¿Qué tamaño (en bits) tiene un UID de Unix?

¿Qué tamaño (en bits) tiene un UID de Unix?

Entiendo que los ID de usuario de Unix (UID) suelen ser enteros sin signo de 16 o 32 bits, pero ¿cómo puedo averiguarlo para un sistema determinado (en un shell)?

Respuesta1

Tendrás que buscar en <limits.h>(o en uno de los archivos que incluye, por ejemplo, sys/syslimits.hen OS X) el #definearchivo 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 buscaría una solución para los sistemas más oscuros que no funcionan. 't.

Respuesta2

glibc proporciona definiciones para todos esos tipos de sistemas.

Puedes comprobar /usr/include/bits/typesizes.h:

% grep UID_T /usr/include/bits/typesizes.h
#define __UID_T_TYPE            __U32_TYPE

A continuación analizas /usr/include/bits/types.h:

% grep '#define __U32_TYPE' /usr/include/bits/types.h
#define __U32_TYPE              unsigned int

Esto le permite averiguar el tipo C. Dado que necesita el tamaño en bytes, su mejor opción es analizar el nombre de typedef de acuerdo con la especificación en types.h:

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

Entonces, aquí hay una sola línea:

% grep '#define __UID_T_TYPE' /usr/include/bits/typesizes.h | cut -f 3 | sed -r 's/__([US])([^_]*)_.*/\1 \2/'
U 32

Aquí Usignifica unsigned(esto también puede ser Spara signed) y 32es el tamaño (búsquelo en la lista anterior; creo que la mayoría de las veces puede asumir que ese ya es el tamaño en bytes, pero si desea que su secuencia de comandos sea completamente portátil, sería mejor activar caseeste valor).

Respuesta3

Eneste enlaceSe hace la pregunta y el respondedor utiliza un método de prueba y error para determinar que el sistema en cuestión utiliza un int largo con signo, dejando 31 bits para almacenar el valor, con un máximo de 2,147,483,647.

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:

Respuesta4

Esa es una pregunta interesante. Me sorprendería que existiera un método estándar y portátil para determinar esto.

No tengo una caja de Linux a mano, pero el idcomando en FreeBSD 8.0 vuelve a cero:

# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)

Estoy seguro de que este es un comportamiento indefinido, pero apuesto a que la mayoría de las versiones idse ajustarían a cero 65'536(si es un UID de 16 bits) 4'294'967'296o se produciría un error si se superara el límite del sistema.

información relacionada