2009-12-17 18 views

risposta

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 grande richiesta (e perché, realisticamente, il 99% delle persone che vengono a questa domanda stanno per essere in esecuzione x86 o x86_64) ...

su un i686 e x86_64 (così, 32- bit e 64 bit) con processore Linux> = 3.0.0, la risposta è:

pid_t: 4 
uid_t: 4 
gid_t: 4 
+20

Bene, il codice è portatile anche se le risposte non lo sono. ;-) –

+2

Le risposte sono portatili per tutti gli obiettivi Linux, per quanto ne so. Sono tutti 4. –

+8

In realtà, il codice non era portatile, perché lo specificatore di formato era '% d', ma' sizeof' restituisce un 'size_t', che è senza segno e non necessariamente la dimensione di un' int'. Lo specificatore di formato portatile corretto è '% zu'. L'ho risolto –

17

In architetture Intel, le dimensioni sono definite /usr/include/bits/typesizes.h:

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

In altre parole, uid_t e gid_t sono senza segno interi a 32 bit e pid_t è un intero a 32 bit con segno. Questo vale sia per i 32 che per i 64 bit.

io non sono sicuro di quello che sono in altre architetture due piedi come io non ho alcun disponibile al momento, ma il modo definitivo di compilare un programma che stampa l'uscita di sizeof(uid_t), ecc

11

I standard definisce pid_t come "tipo intero" e uid_t e gid_t semplicemente come "tipi interi" (così codice portabile non dovrebbe assumere qualsiasi tipo particolare di loro).

+0

Quale standard? –

+0

La mia manpage per 'types.h', che afferma di essere POSIX, dice' uid_t' e 'gid_t' sono tipi interi (nessuna menzione di firmati o non firmati), e' pid_t' è un tipo di intero con segno. – ptomato

+0

@Chris Ho sbagliato su "pid_t", quindi ho corretto il mio post. Lo standard non dice nulla sulla firma di "uid_t" o "gid_t", comunque. –