2009-12-17 5 views

Antwort

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: Per vielfachen Wunsch (und weil, realistisch gesehen, 99% der Menschen auf diese Frage kommen werden x86 oder x86_64 zu laufen) ...

auf einem i686 und x86_64 (so, 32- Bit und 64-Bit) Prozessor mit Linux> = 3.0.0, lautet die Antwort:

pid_t: 4 
uid_t: 4 
gid_t: 4 
+20

Nun, der Code ist tragbar, auch wenn die Antworten nicht sind. ;-) –

+2

Die Antworten sind soweit ich weiß auf alle Linux-Targets übertragbar. Sie sind alle 4. –

+8

Eigentlich war der Code nicht portierbar, weil der Formatbezeichner '% d' war, aber' sizeof' gibt ein 'size_t' zurück, das unsigned ist und nicht unbedingt die Größe eines' int'. Der korrekte portable Formatbezeichner ist '% zu'. Ich habe es repariert. –

17

auf Intel-Architekturen sind Größen in /usr/include/bits/typesizes.h definiert:

Mit anderen Worten
#define __UID_T_TYPE   __U32_TYPE 
#define __GID_T_TYPE   __U32_TYPE 
#define __PID_T_TYPE   __S32_TYPE 

, uid_t und gid_t sind unsigned 32-Bit-Integer und pid_t ist eine ganze Zahl 32-Bit unterzeichnet. Dies gilt sowohl für 32- als auch für 64-Bit-Bits.

Ich bin nicht sicher, was sie auf andere Architekturen offhand sind, wie ich habe keine zur Zeit zur Verfügung, aber die endgültige Art und Weise ist es, ein Programm zu kompilieren, die die Ausgabe von sizeof(uid_t) druckt usw.

11

Die standardpid_t definiert als „vorzeichenbehaftete Ganzzahl-Typ“ und uid_t und gid_t lediglich als „Integer-Typen“ (so sollte portablen Code keinen bestimmten Typ für sie übernehmen).

+0

Welcher Standard? –

+0

Meine Manpage für 'types.h', die behauptet, POSIX zu sein, sagt' uid_t' und 'gid_t' sind Integer-Typen (keine Erwähnung von signed oder unsigned) und' pid_t' ist ein vorzeichenbehafteter Integer-Typ. – ptomato

+0

@Chris Ich habe mich wegen "pid_t" geirrt, also habe ich meinen Beitrag korrigiert. Der Standard sagt jedoch nichts über die Signiertheit von "uid_t" oder "gid_t" aus. –