1
With fork()
操作子進程從父進程繼承屬性真實有效的用戶標識,當執行exec()
時它的行爲如何?執行後的RUID&EUID()
With fork()
操作子進程從父進程繼承屬性真實有效的用戶標識,當執行exec()
時它的行爲如何?執行後的RUID&EUID()
Exec不會更改它們中的任何一個。從linux手冊:
exec()系列函數用新的過程映像替換當前過程映像。
的EXEC改變處理圖像(在存儲器中的代碼和數據段),但它不改變與叉創建的新進程的進程描述符。進程描述符包含真實有效的id,因爲這不會被exec調用所改變,所以有效和真實的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將被繼承,並且在執行之前和之後會有所不同。 –
他們是一樣的!我改進了我的答案,我希望我已經有用了。 –
非常感謝您的解釋。 –