linux - exec() 之后的 RUID 和 EUID

标签 linux exec fork

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

最佳答案

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

The exec() family of functions replaces the current process image with a new process image.

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

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

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

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

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

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

关于linux - exec() 之后的 RUID 和 EUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17785983/

相关文章:

linux - 查找具有某些属性的文件

linux - 访问存储在家庭服务器上的网页

bash - 如何在 docker 容器中运行/bin/bash?

c - waitpid 不工作- efault 错误

Perl 脚本不能 fork 超过 10 次

unix - fork(),总是先运行父进程,然后运行子进程

基于 Linux/Debian 的应用程序无法编译

c++ - 在 Linux 中,recv() 有效但 recvmsg() 无效

c - 重定向标准流

C 用 exec() 和 fork() 对字符串数组进行排序;