Linux 鲁伊德;exec()之后的EUID

Linux 鲁伊德;exec()之后的EUID,linux,exec,fork,Linux,Exec,Fork,使用fork()操作子进程从父进程继承属性real和effective user Id,执行exec()时它的行为如何 Exec不会更改它们中的任何一个。从linux手册: exec()函数族用新的进程映像替换当前进程映像 exec会更改进程映像(内存中的代码和数据段),但不会更改使用fork创建的新进程的进程描述符。进程描述符包含实际id和有效id,因为exec调用不会更改此id,所以有效id和实际id也不会更改 我希望我已经清楚地解释了这个概念 子进程的实际有效UID和GID等于父进程的实际

使用
fork()
操作子进程从父进程继承属性real和effective user Id,执行
exec()
时它的行为如何

Exec不会更改它们中的任何一个。从linux手册:

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

exec会更改进程映像(内存中的代码和数据段),但不会更改使用fork创建的新进程的进程描述符。进程描述符包含实际id和有效id,因为exec调用不会更改此id,所以有效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; 
} 
#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不会更改它们中的任何一个。从linux手册:

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

exec会更改进程映像(内存中的代码和数据段),但不会更改使用fork创建的新进程的进程描述符。进程描述符包含实际id和有效id,因为exec调用不会更改此id,所以有效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; 
} 
#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将被继承,并且在执行前后相同或不同。它们是相同的!我改进了我的答案,我希望我的答案有用。非常感谢您的解释。我想知道在执行
exec()
后,RUID和EUID的实际情况,这意味着用户Id将被继承,并且在执行前后相同或不同。它们是相同的!我改进了我的答案,我希望我对你有用。非常感谢你的解释。