2009-12-17 5 views

Répondre

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: par demande populaire (et parce que, de façon réaliste, 99% des gens qui viennent à cette question vont être en cours d'exécution x86 ou x86_64) ...

Sur un i686 et x86_64 (donc, 32- processeur bit et 64 bits) sous Linux> = 3.0.0, la réponse est:

pid_t: 4 
uid_t: 4 
gid_t: 4 
+20

Eh bien, le code est portable même si les réponses ne le sont pas. ;-) –

+2

Les réponses sont portables à toutes les cibles Linux autant que je sache. Ils sont tous 4. –

+8

En fait, le code n'était pas portable, parce que le spécificateur de format était '% d' mais' sizeof' renvoie un 'size_t', qui est non signé et pas nécessairement la taille d'un' int'. Le spécificateur de format portable correct est '% zu'. Je l'ai réparé. –

17

Sur les architectures intel, les tailles sont définies dans /usr/include/bits/typesizes.h:

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

En d'autres termes, uid_t et gid_t ne sont pas signés entiers 32 bits et pid_t est un entier signé 32 bits. Ceci s'applique à la fois aux 32 et 64 bits.

Je ne sais pas ce qu'ils sont sur d'autres architectures que je ne désinvolture ai pas disponible pour le moment, mais la façon définitive est de compiler un programme qui imprime la sortie de sizeof(uid_t), etc.

11

Les standard définit pid_t comme un « type entier signé » et uid_t et gid_t simplement comme « types entiers » (donc du code portable ne doit pas supposer un type particulier pour eux).

+0

Quelle norme? –

+0

Ma page de manuel pour 'types.h', qui prétend être POSIX, dit' uid_t' et 'gid_t' sont des types entiers (aucune mention de signed ou unsigned), et' pid_t' est un type entier signé. – ptomato

+0

@Chris J'avais tort à propos de "pid_t", alors j'ai corrigé mon message. La norme ne dit rien sur la signature de "uid_t" ou "gid_t", cependant. –