1

随着fork()操作子进程从父进程继承属性真实有效的用户ID,它在执行时如何表现exec()

4

1 回答 1

5

Exec 不会更改其中任何一个。来自linux手册:

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

exec会更改进程映像(内存中的代码和数据段),但不会更改使用 fork 创建的新进程的进程描述符。进程描述符包含真实有效的 id,因为这不会被exec调用改变,有效和真实的 id 也不会改变。

我希望我已经清楚地解释了这个概念。

子进程真实有效的UID和GID等于父进程真实有效的UID和GID。因此,当子进程调用exec时,这些值不会被修改。

为了证明这一点,我编写了一个小应用程序,它创建了一个调用exec的子进程。exec系统调用运行一个应用程序,该应用程序打印出当前进程的 GID 和 UID 的值。此外还显示了父进程的 GID 和 UID,以便我们进行比较。

主程序

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

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

于 2013-07-22T11:19:31.767 回答