fork()
操作创建子进程时,子进程继承父进程的实际用户ID和有效用户ID属性。当执行exec()
函数时,子进程的已继承属性将被保留。Exec函数不会改变任何进程描述符。来自Linux手册:
exec()函数族用于将当前进程映像替换为新的进程映像。
exec函数会改变进程映像(内存中的代码和数据段),但它不会改变使用fork创建的新进程的进程描述符。进程描述符包含真实ID和有效ID,因为这些都不会被exec调用改变,所以有效ID和真实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;
}
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
--------------------------------
如果您需要更多信息,请告诉我。
exec()
之后RUID和EUID实际上会发生什么,也就是说用户ID是否会被继承并保持相同,还是在执行前后会有所不同。 - Sunil Bojanapally