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!