Exec不会改变它们中的任何一个.从linux手册:
exec()函数系列用新的过程映像替换当前过程映像.
在EXEC改变处理图像(在存储器中的代码和数据段),但它不改变与叉创建的新进程的进程描述符.进程描述符包含真实有效的id,因为exec调用不会改变它,有效和真实的id也不会改变.
我希望我已经清楚地解释了这个概念.
子进程的真实有效UID和GID等于父进程的真实有效UID和GID.因此,当子进程调用exec时,这些值不会被修改.
为了证明这一点,我写了一个小应用程序,它创建了一个调用exec的子进程.该EXEC系统调用运行打印出当前进程的GID和UID值的应用程序.此外,还显示父进程的GID和UID,以便我们可以比较它们.
main.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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
CHILD 17436 -------------------
UID GID
Real 1000 Real 1000
Effective 1000 Effective 1000
---------------------------------
Father 17435 -------------------
UID GID
Real 1000 Real 1000
Effective 1000 Effective 1000
--------------------------------
Run Code Online (Sandbox Code Playgroud)
如果您需要更多信息,请告诉我.