setgroups函数用法及示例
setgroups函数用法及示例
服务器繁忙,请稍后再试。
setgroups函数用法及示例
setgroups 是 Unix/Linux 系统中的系统调用函数,用于设置调用进程的附加组 ID(supplementary group IDs)。它需要特权权限(通常是 root 用户),通常与权限管理相关(如切换用户身份)。
函数原型
1 |
|
- 参数:
size:数组list中的元素数量。list:指向gid_t类型数组的指针,包含要设置的组 ID 列表。
- 返回值:
- 成功时返回
0; - 失败时返回
-1并设置errno(常见错误:EPERM表示无权限)。
- 成功时返回
关键说明
- 需要特权:只有
root用户或有CAP_SETGID能力的进程可调用。 - 覆盖原有组:调用后会完全替换进程当前的附加组 ID 列表。
- 安全实践:通常在
setgid()和setuid()前调用,以彻底放弃特权。
示例代码
以下示例展示如何用 setgroups 将进程的附加组设置为 1001 和 1002,并切换至非特权用户:
1 |
|
编译与运行
- 编译:
1
gcc -o setgroups_example setgroups_example.c
- 运行(需 root):
1
sudo ./setgroups_example
- 输出示例:
1
权限已切换!当前 UID=1000, GID=1000
常见错误
- 权限不足(
EPERM):- 非 root 用户调用会失败。
- 确保程序以
root启动(如通过sudo)。
- 无效组 ID:
- 确保
list中的组 ID 在/etc/group中存在。
- 确保
- 数组大小超限:
size不能超过系统限制(sysconf(_SC_NGROUPS_MAX))。
替代函数
initgroups(const char *user, gid_t gid):- 自动根据用户名设置附加组(包含
/etc/group中的组)。 - 更安全便捷,推荐优先使用。
- 自动根据用户名设置附加组(包含
1 | // 示例:使用 initgroups 设置用户 "john" 的附加组 |
建议在需要精细控制组 ID 时使用 setgroups,普通场景用 initgroups 更简便。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Helloeuler!
