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/