exec()后的RUID和EUID是什么意思?

3
fork()操作创建子进程时,子进程继承父进程的实际用户ID和有效用户ID属性。当执行exec()函数时,子进程的已继承属性将被保留。
1个回答

8

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
它们是一样的!我改进了我的答案,希望对你有所帮助。 - Giuseppe Pes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接