【发布时间】:2016-12-01 00:42:14
【问题描述】:
我想使用系统调用setgid,来改变当前进程的组ID。试图查找这个函数,我发现的唯一实现是在 kern_prot.c 中:
/*
* setgid
*
* Description: Set group ID system call
*
* Parameters: uap->gid gid to set
...
..
.
*/
int
setgid(proc_t p, struct setgid_args *uap, __unused int32_t *retval)
{
...
..
.
}
请注意,根据 /usr/unistd.h,API 完全不同(int setgid(gid_t);)。
-
int setgid(gid_t);是int setgid(proc_t p, struct setgid_args *uap, __unused int32_t *retval)的包装器吗 - 在哪里可以找到
int setgid(gid_t);的实现? - 是否有任何选项可以从 kern_prot.c 调用 setgid 的实现?
更新:
用dtruss监控我的程序观察系统调用后,似乎调用setgid(gid_t)触发了带3个参数的系统调用
setgid(0x2, 0x7F9AA3803200, 0x1000) 与 kern_prot.c 中的实现相匹配。问题是,我在哪里可以找到包装源代码,它属于哪个库(可能是 glibc?)
谢谢,
【问题讨论】:
-
您很可能是正确的,因为暴露给用户空间的 setgid API 实际上是围绕 setgid 系统调用的 glibc 包装器。
-
@mauzel,感谢您的评论。唯一仍然困扰我的是,如果我
#include <unistd.h> #include <sys/syscall.h> #include <errno.h>并运行以下系统调用,那么它似乎可以工作,并且 api 使用单个参数(syscall(SYS_setgid, gid);)。我还是不明白这个矛盾。 -
所以我对 mac OS X/BSD 一无所知,但你确定它没有调用它吗? lxr.free-electrons.com/source/kernel/sys.c?v=3.10#L646