Linux上的pid_t、uid_t和gid_t的大小

44
在 Linux 系统上(无论是 32 位还是 64 位),pid_tuid_tgid_t 的大小是多少?
3个回答

74
#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

6
据我所知,这些答案可在所有 Linux 目标平台上使用。它们都是 4。 - R.. GitHub STOP HELPING ICE
21
实际上,这段代码不具备可移植性,因为格式说明符是%d,但sizeof返回的是size_t,它是无符号的,并且不一定是int的大小。正确的可移植格式说明符是%zu。我已经修复了它。 - rob mayoff
3
最好也包括至少一个示例架构的结果。 - Pavel Šimerda
1
4 是否表示 4 个字节? - Zap
1
@Zap 是的(冗长的解释:它意味着四个字符,而单个字符是C语言中最接近字节的东西...当然,“字节”通常是一个八位组(8位),但它最初的意思是最小可寻址的内存单元 - 在某些硬件上,这个大小可能与8位不同,但C语言要求char/字节至少为8位,除非你在为DSP编写裸机代码,否则其他情况相当罕见)。 - mtraceur

28

在英特尔体系结构中,大小是在 /usr/include/bits/typesizes.h 中定义的:

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

换句话说,uid_tgid_t是无符号32位整数,而pid_t是有符号32位整数。这适用于32位和64位。

我不确定其他架构上它们的情况,因为我目前没有可用的设备,但明确的方法是编译一个程序,打印sizeof(uid_t)等输出。


在Linux上,无论架构如何,它们都是相同的。但是,在其他操作系统上可能会有所不同:在64位AIX上,pid_t是一个带符号的64位整数,但内核从不分配超出32位范围的PID,以便与使用32位pid_t的32位进程兼容。此外,在某些32位平台(例如Solaris)上,虽然pid_t仍然是带符号的32位,但它是long而不是int-它们在物理上是相同的,但C将它们视为不同的类型,这可能会导致一些编译警告,涉及强制转换等。 - Simon Kissane

18

这个标准pid_t定义为“有符号整型”,而将uid_tgid_t仅定义为“整型”(因此可移植的代码不应该假设它们具有特定的类型)。


1
我的 types.h 手册声称符合 POSIX 标准,其中 uid_tgid_t 是整数类型(未提及有符号或无符号),而 pid_t 则是有符号整数类型。 - ptomato
@Chris,我关于“pid_t”的说法是错误的,所以我已经更正了我的帖子。然而,标准并没有说明“uid_t”或“gid_t”的有符号性。 - Steve Emmerson
请注意,标准还提供了“id_t”类型,它“可以用于至少包含pid_tuid_tgid_t”。 - rob mayoff
pid_t数据类型是有符号整数类型,能够表示进程ID。在GNU C库中,它是一个int类型。(https://www.gnu.org/software/libc/manual/html_node/Process-Identification.html) - debug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接