RUID&执行后的EUID()

时间:2013-07-22 11:05:39

标签: linux exec fork

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

1 个答案:

答案 0 :(得分:5)

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

  

exec()系列函数用新的过程映像替换当前过程映像。

exec 更改了进程映像(内存中的代码和数据段),但它不会更改使用fork创建的新进程的进程描述符。进程描述符包含真实有效的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; 
} 

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  
--------------------------------

如果您需要更多信息,请与我们联系。