我对linux中的getuid()
和geteuid()
有疑问。
我知道getuid将返回当前进程的真实用户ID。此外,geteuid()
将返回当前进程的有效用户ID。
我的问题是,存储有关id的信息。除了 / etc / passwd 之外,我认为每个进程都应该在某处存储自己的id信息。
如果我是对的,请告诉我存储的信息在哪里(比如堆栈区域)。如果我错了,这个过程如何得到它的身份?
答案 0 :(得分:3)
这是由内核在其内部内存结构中维护的。
Linux内核使用名为struct task_struct
的东西:
Linux下的每个进程都动态分配
struct task_struct
结构。
在Linux内核4.12.10中,定义如下:
struct task_struct {
...
/* Objective and real subjective task credentials (COW): */
const struct cred __rcu *real_cred;
/* Effective (overridable) subjective task credentials (COW): */
const struct cred __rcu *cred;
struct cred {
...
kuid_t uid; /* real UID of the task */
kgid_t gid; /* real GID of the task */
kuid_t suid; /* saved UID of the task */
kgid_t sgid; /* saved GID of the task */
kuid_t euid; /* effective UID of the task */
kgid_t egid; /* effective GID of the task */
kuid_t fsuid; /* UID for VFS ops */
kgid_t fsgid; /* GID for VFS ops */
用户空间进程无法直接访问这些结构。要获取此信息,此类进程必须使用系统调用(例如getuid()
和geteuid()
)或/proc
文件系统。
答案 1 :(得分:1)
阅读Advanced Linux Programming,也许Operating System: Three Easy Pieces(两者都可免费下载)。
(需要几本书来回答你的问题)
getuid(2)(与getpid(2)和其他许多人一样)system call由Linux kernel提供并实施。 syscalls(2)是他们的列表。
(请花点时间详细了解系统调用)
存储有关id的信息。
内核管理描述每个process的数据(在内核内存中,有关详细信息,请参阅NPE's answer)。每个系统调用都是一个原始的原子操作(从user-space角度来看)并返回一个结果(通常在某个寄存器中,而不是在内存中)。阅读CPU modes。
因此,该进程的用户级virtual address space中的信息不,每次调用getuid
时都会返回该信息。