Linux 上 pid_t、uid_t、gid_t 的大小

Posted

技术标签:

【中文标题】Linux 上 pid_t、uid_t、gid_t 的大小【英文标题】:Size of pid_t, uid_t, gid_t on Linux 【发布时间】:2010-12-27 17:21:29 【问题描述】:

在 Linux 系统(32 位或 64 位)上,pid_tuid_tgid_t 的大小是多少?

【问题讨论】:

【参考方案1】:

在英特尔架构上,大小在/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) 等的输出。

【讨论】:

【参考方案2】:
#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(即 32 位和 64 位)处理器上,答案是:

pid_t: 4
uid_t: 4
gid_t: 4

【讨论】:

据我所知,答案可移植到所有 Linux 目标。他们都是 4 岁。 实际上,代码是不可移植的,因为格式说明符是%d,但sizeof返回一个size_t,它是无符号的,不一定是int的大小。正确的可移植格式说明符是%zu。我已经修好了。 最好也包含至少一个示例架构的结果。 4 是否意味着 4 个字节?【参考方案3】:

standard 将pid_t 定义为“有符号整数类型”,而将uid_tgid_t 定义为“整数类型”(因此可移植代码不应为它们假定任何特定类型)。

【讨论】:

我的 types.h 的手册页声称是 POSIX,说 uid_tgid_t 是整数类型(没有提到有符号或无符号),pid_t 是有符号整数类型. @Chris 我对“pid_t”有误,所以我更正了我的帖子。但是,该标准没有说明“uid_t”或“gid_t”的签名。 请注意,该标准还提供了id_t 类型,“可用于包含至少一个pid_tuid_tgid_t”。 pid_t 数据类型是有符号整数类型,能够表示进程 ID。在 GNU C 库中,这是一个 int。 (gnu.org/software/libc/manual/html_node/…)

以上是关于Linux 上 pid_t、uid_t、gid_t 的大小的主要内容,如果未能解决你的问题,请参考以下文章

消息队列函数

关于pid_t和fork()的理解,linux tomcat mysql php安装

c_cpp Linux发送信号函数int kill(pid_t pid,int sig);

进程号的类型定义pid_t

Linux内核接口特定的类型

带有char数组的pid_t的初始值是多少? [复制]