gpt4 book ai didi

linux - exec() 之后的 RUID 和 EUID

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:37 26 4
gpt4 key购买 nike

fork() 操作子进程从父进程继承属性真实有效的用户 Id,当执行 exec() 时它的行为如何?

最佳答案

Exec 不会改变它们中的任何一个。来自 linux 手册:

The exec() family of functions replaces the current process image with a new process image.

exec改变了进程镜像(内存中的代码和数据段),但它并没有改变用fork创建的新进程的进程描述符。进程描述符包含真实和有效的 id,因为这不会被 exec 调用改变,有效和真实的 id 也不会改变。

我希望我已经清楚地解释了这个概念。

子进程真实有效的UID和GID等于父进程真实有效的UID和GID。因此,当子进程调用 exec 时,这些值不会被修改。

为了证明这一点,我编写了一个小应用程序,它创建了一个调用 exec 的子进程。 exec 系统调用运行一个应用程序,打印出当前进程的 GID 和 UID 的值。此外还显示了父进程的 GID 和 UID,以便我们进行比较。

主.c

#include <stdio.h> 
#include <unistd.h>


void print_info () {

printf(" UID GID \n"
"Real %d Real %d \n"
"Effective %d Effective %d \n",
getuid (), getgid (),
geteuid(), getegid()
);
return;
}


int main () {

pid_t pid;
int status;
pid = fork();

if (!pid) {
puts("Childe process\n");
execv("./uid.out", NULL);
return;
}

wait(status);

printf("Father %d -------------------\n", getpid());
print_info();
puts("--------------------------------");

return 0;
}

uid.c

#include <stdio.h> 
#include <unistd.h>

int main () {

printf("CHILD %d -------------------\n", getpid());
printf(" UID GID \n"
"Real %d Real %d \n"
"Effective %d Effective %d \n",
getuid (), getgid (),
geteuid(), getegid()
);
puts("---------------------------------");
return 0;
}

输出:

CHILD  17436 -------------------
UID GID
Real 1000 Real 1000
Effective 1000 Effective 1000
---------------------------------
Father 17435 -------------------
UID GID
Real 1000 Real 1000
Effective 1000 Effective 1000
--------------------------------

如果您需要更多信息,请告诉我。

关于linux - exec() 之后的 RUID 和 EUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17785983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com