getresuid - 获取进程的真实、有效和保存的用户ID
data-ad-format="fluid" data-ad-layout-key="-7k+ex-4a-9w+4a">getresuid和getresgid是Linux系统调用,用于获取进程的用户和组ID信息。getresuid获取真实用户ID、有效用户ID和保存的设置用户ID;getresgid获取对应的组ID。两者都通过指针参数返回三个ID值,成功返回0,失败返回-1并设置errno。示例代码展示了如何获取并分析这些ID信息,包括错误处理和权限状态分析。相关函数包括getuid、setuid等用于用户/组ID管理的系统调用。
1. 函数介绍
getresuid 是一个 Linux 系统调用,用于同时获取当前进程的真实用户 ID(Real User ID)、有效用户 ID(Effective User ID)和保存的设置用户 ID(Saved Set-user-ID)。这三个 ID 构成了 Unix/Linux 系统中完整的用户身份管理体系。
2. 函数原型
1 | #include <unistd.h> |
getresgid - 获取进程的真实、有效和保存的组ID
1. 函数介绍
getresgid 是一个 Linux 系统调用,用于同时获取当前进程的真实组 ID(Real Group ID)、有效组 ID(Effective Group ID)和保存的设置组 ID(Saved Set-group-ID)。
2. 函数原型
1 | #include <unistd.h> |
3. 功能对比
函数功能参数getresuid(ruid, euid, suid)获取用户 ID 三元组3个 uid_t* 指针getresgid(rgid, egid, sgid)获取组 ID 三元组3个 gid_t* 指针
4. 参数说明
getresuid 参数:
uid_t *ruid: 指向存储真实用户 ID 的变量的指针
uid_t *euid: 指向存储有效用户 ID 的变量的指针
uid_t *suid: 指向存储保存的设置用户 ID 的变量的指针
getresgid 参数:
gid_t *rgid: 指向存储真实组 ID 的变量的指针
gid_t *egid: 指向存储有效组 ID 的变量的指针
gid_t *sgid: 指向存储保存的设置组 ID 的变量的指针
5. 返回值
成功时:返回 0
失败时:返回 -1,并设置 errno
6. 常见 errno 错误码
- EFAULT: 指针参数指向无效内存地址
7. 相似函数,或关联函数
getuid(), geteuid(): 分别获取真实和有效用户 ID
getgid(), getegid(): 分别获取真实和有效组 ID
setresuid(), setresgid(): 设置用户/组 ID 三元组
setreuid(), setregid(): 设置真实和有效 ID
setuid(), setgid(): 设置用户/组 ID
seteuid(), setegid(): 设置有效用户/组 ID
8. 示例代码
示例1:基本使用 - 获取完整的 ID 信息
1 | #include <stdio.h> |
示例2:错误处理和权限分析
1 | #include <stdio.h> |
示例3:权限切换和恢复演示
1 | #include <stdio.h> |
示例4:安全审计和监控工具
1 | #include <stdio.h> |
9. ID 类型说明
Unix/Linux 系统中的三类 ID:
1 | // 用户 ID 三元组 |
10. 实际应用场景
场景1:权限管理工具
1 | int can_drop_privileges_completely() { |
场景2:安全审计
1 | void audit_process_privileges() { |
场景3:权限恢复
1 | int restore_original_privileges() { |
11. 注意事项
使用 getresuid 和 getresgid 时需要注意:
指针有效性: 所有指针参数必须指向有效的内存地址
错误处理: 虽然很少失败,但仍需检查返回值
权限检查: 获取其他进程的 ID 信息可能需要权限
并发安全: 在多线程环境中注意数据一致性
系统兼容: 在所有现代 Unix/Linux 系统中都可用
总结
getresuid 和 getresgid 是管理进程身份信息的重要函数:
关键特性:
完整信息: 一次性获取所有相关的 ID 信息
原子操作: 保证获取的 ID 组是一致的
安全相关: 是权限管理和安全审计的基础
系统调用: 直接访问内核信息,性能良好
主要应用:
安全审计和监控工具
权限管理和切换程序
系统管理和调试工具
容器和虚拟化环境中的权限控制
正确理解和使用这些函数对于编写安全、可靠的 Unix/Linux 程序至关重要,特别是在需要进行权限管理和安全检查的场景中。
https://www.calcguide.tech/2025/09/09/getresuid-syscall-demo/
getresuid系统调用及示例-CSDN博客