exec()之后的RUID和EUID

Sun*_*lly 1 linux fork exec

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

Giu*_*Pes 5

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)

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