2009-12-17 27 views

Respuesta

50
#include <stdio.h> 
#include <sys/types.h> 

int main() 
{ 
    printf("pid_t: %zu\n", sizeof(pid_t)); 
    printf("uid_t: %zu\n", sizeof(uid_t)); 
    printf("gid_t: %zu\n", sizeof(gid_t)); 
} 

EDIT: Por petición popular (y porque, siendo realistas, el 99% de las personas que vienen a esta pregunta se va a ejecutar x86 o x86_64) ...

en un i686 y x86_64 (así, 32- procesador de bit y 64 bits) que ejecuta Linux> = 3.0.0, la respuesta es:

pid_t: 4 
uid_t: 4 
gid_t: 4 
+20

Bueno, el código es portable incluso si las respuestas no lo son. ;-) –

+2

Las respuestas son portátiles para todos los objetivos de Linux, hasta donde yo sé. Son todos 4. –

+8

En realidad, el código no era portátil, porque el especificador de formato era '% d' pero' sizeof' devuelve 'size_t', que no está firmado y no tiene necesariamente el tamaño de un' int'. El especificador de formato portátil correcto es '% zu'. Lo he arreglado –

17

En arquitecturas Intel, tamaños se definen en /usr/include/bits/typesizes.h:

#define __UID_T_TYPE   __U32_TYPE 
#define __GID_T_TYPE   __U32_TYPE 
#define __PID_T_TYPE   __S32_TYPE 

En otras palabras, uid_t y gid_t son enteros sin signo de 32 bits y pid_t es un entero de 32 bits con signo. Esto aplica tanto para 32 bits como para 64 bits.

no estoy seguro de lo que son en otras arquitecturas improvisada, ya que no tenían ninguna disponible en el momento, pero la forma definitiva es compilar un programa que imprime la salida de sizeof(uid_t), etc.

11

Los standard define pid_t como un "tipo entero de" y uid_t y gid_t simplemente como "tipos de enteros" (lo que el código portátil no debe suponer ningún tipo particular para ellos).

+0

¿Qué estándar? –

+0

Mi página de manual para 'types.h', que dice ser POSIX, dice' uid_t' y 'gid_t' son tipos enteros (sin mención de firmado o sin firmar), y' pid_t' es un tipo de entero con signo. – ptomato

+0

@Chris Me equivoqué con "pid_t", así que corrigí mi publicación. Sin embargo, el estándar no dice nada sobre la firma de "uid_t" o "gid_t". –

Cuestiones relacionadas