getgid() 和 getegid() 的原型如下所示:
[C++] 纯文本查看 复制代码 #include <unistd.h>
#include <sys/types.h>
gid_t getgid(void);
gid_t getegid(void);
getuid() 用来获取执行当前进程的 GID 。
getedui() 用来获取执行当前进程的有效 GID 。
测试代码:
[C++] 纯文本查看 复制代码 #include <errno.h>
#include <stdlib.h>
int main()
{
printf ("Process's gid = %d, egid = %d\n", getgid(), getegid());
int fd;
if ( (fd = open("temp.txt", O_RDONLY)) == -1) {
printf("Open failure, errno is %d:%s\n", errno, strerror(errno));
exit (EXIT_FAILURE);
} else {
printf ("Open successfully!\n");
}
close(fd);
exit (EXIT_SUCCESS);
}
在运行程序之前,先用 beyes 这个用户建立了一个 temp.txt 的文件:ls -al temp.txt
-rw-r--r-- 1 beyes users 0 Dec 24 20:15 temp.txt 这里,该文件的属主是 beyes,用户组是 users 组,通过 /etc/passwd 文件可以看到,users 组的编号,即 gid 值为 100 。然后我们将该文件的其它组的读权限去掉:
接着在建立一个 groad 的用户,并用 usermod 命令将它的 gid 变为 101 ,如:
下面分别用 beyes ,root,groad 这 3 个用户来运行该程序:
beyes./getgid
Process's gid = 100, egid = 100
Open successfully!
root# ./getgid
Process's gid = 0, egid = 0
Open successfully!
groad./getgid
Process's gid = 101, egid = 101
Open failure, errno is 13:Permission denied
由上可见,groad 并没有权限打开该文件。
下面我们用 chmod 命令修改一下 getpid 这个程序的有效用户组权限:也就是说,如果某个用户运行该程序,那么会继承 users 组的权限。此时再用 groad 这个用户运行该程序:./getgid
Process's gid = 101, egid = 100
Open successfully! 由上可见,用户组的有效 GID 已经发生变化,变为 users 组,所以 groad 可以打开这个文件了。 |