2013-07-22 14 views

回答

4

Exec不會更改它們中的任何一個。從linux手冊:

exec()系列函數用新的過程映像替換當前過程映像。

EXEC改變處理圖像(在存儲器中的代碼和數據段),但它不改變與叉創建的新進程的進程描述符。進程描述符包含真實有效的id,因爲這不會被exec調用所改變,所以有效和真實的id也不會被改變。

我希望我已經清楚地解釋了這個概念。

子進程真實有效的UID和GID等於父進程真實有效的UID和GID。因此,當子進程調用exec時,這些值不會被修改。

爲了證明這一點,我編寫了一個小應用程序,創建一個子進程,它調用execexec系統調用運行一個應用程序,該應用程序輸出當前進程的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 
-------------------------------- 

讓我知道,如果你需要更多信息。

+0

我想知道在exec()執行後RUID和EUID實際發生了什麼,這意味着用戶ID將被繼承,並且在執行之前和之後會有所不同。 –

+0

他們是一樣的!我改進了我的答案,我希望我已經有用了。 –

+0

非常感謝您的解釋。 –