在 Linux 系统上(无论是 32 位还是 64 位),
pid_t
、uid_t
和 gid_t
的大小是多少?#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));
}
编辑:基于广泛需求(而且,现实情况是,99%的人来到这个问题都会运行x86或x86_64)...
在运行Linux >= 3.0.0的i686和x86_64处理器上,答案是:
pid_t: 4
uid_t: 4
gid_t: 4
在英特尔体系结构中,大小是在 /usr/include/bits/typesizes.h
中定义的:
#define __UID_T_TYPE __U32_TYPE
#define __GID_T_TYPE __U32_TYPE
#define __PID_T_TYPE __S32_TYPE
换句话说,uid_t
和gid_t
是无符号32位整数,而pid_t
是有符号32位整数。这适用于32位和64位。
我不确定其他架构上它们的情况,因为我目前没有可用的设备,但明确的方法是编译一个程序,打印sizeof(uid_t)
等输出。
pid_t
是一个带符号的64位整数,但内核从不分配超出32位范围的PID,以便与使用32位pid_t
的32位进程兼容。此外,在某些32位平台(例如Solaris)上,虽然pid_t
仍然是带符号的32位,但它是long
而不是int
-它们在物理上是相同的,但C将它们视为不同的类型,这可能会导致一些编译警告,涉及强制转换等。 - Simon Kissane这个标准将pid_t
定义为“有符号整型”,而将uid_t
和gid_t
仅定义为“整型”(因此可移植的代码不应该假设它们具有特定的类型)。
types.h
手册声称符合 POSIX 标准,其中 uid_t
和 gid_t
是整数类型(未提及有符号或无符号),而 pid_t
则是有符号整数类型。 - ptomatopid_t
、uid_t
或gid_t
”。 - rob mayoff
%d
,但sizeof
返回的是size_t
,它是无符号的,并且不一定是int
的大小。正确的可移植格式说明符是%zu
。我已经修复了它。 - rob mayoffchar
/字节至少为8位,除非你在为DSP编写裸机代码,否则其他情况相当罕见)。 - mtraceur