Linux中的進程程序替換
- 1. 替換原理
- 2. 替換函數
- 3. 函數解釋
- 4. 命名理解
- 程序替換的意義
1. 替換原理
替換原理
用fork創建子進程后執行的是和父進程相同的程序(但有可能執行不同的代碼分支),子進程往往要調用一種exec函數以執行另一個程序。當進程調用一種exec函數時,該進程的用戶空間代碼和數據完全被新程序替換,從新程序的啟動例程開始執行。調用exec并不創建新進程,所以調用exec前后該進程的id并未改變。
我們在替換新程序時,只是把我們目標程序的數據和代碼替換到原來的進程的物理內存中(實際上是覆蓋掉原來的代碼和數據)
2. 替換函數
其實有六種以exec開頭的函數,統稱exec函數:
#include <unistd.h>`
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
/
int execve(const char *path, char *const argv[], char *const envp[]);
3. 函數解釋
這些函數如果調用成功則加載新的程序從啟動代碼開始執行,不再返回。
如果調用出錯則返回-1
所以exec函數只有出錯的返回值而沒有成功的返回值。
4. 命名理解
這些函數原型看起來很容易混,但只要掌握了規律就很好記。
l(list) : 表示參數采用列表
v(vector) : 參數用數組
p(path) : 有p自動搜索環境變量PATH
e(env) : 表示自己維護環境變量
exec調用舉例如下:
#include <unistd.h>
int main()
{char *const argv[] = {"ps", "-ef", NULL};char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};execl("/bin/ps", "ps", "-ef", NULL);// 帶p的,可以使用環境變量PATH,無需寫全路徑execlp("ps", "ps", "-ef", NULL);// 帶e的,需要自己組裝環境變量execle("ps", "ps", "-ef", NULL, envp);execv("/bin/ps", argv);// 帶p的,可以使用環境變量PATH,無需寫全路徑execvp("ps", argv);// 帶e的,需要自己組裝環境變量execve("/bin/ps", argv, envp);exit(0);
}
事實上,只有execve是真正的系統調用,其它五個函數最終都調用 execve,所以execve在man手冊 第2節,其它函數在man手冊第3節。這些函數之間的關系如下圖所示。
下圖exec函數族 一個完整的例子
程序替換的意義
總的來說:無論哪種方式,程序替換都會立即停止當前正在運行的程序,并用新程序替換它。
程序替換在Linux系統中有一些重要的意義和用途:
軟件更新:程序替換是更新軟件的常見方法之一。通過將舊版本的程序替換為新版本,可以獲得修復的漏洞、改進的功能和性能優化等好處。程序替換使得在不中斷服務的情況下升級軟件成為可能。
系統維護:在系統維護過程中,程序替換可以用于修復損壞的或出現故障的程序。通過替換受損的程序,可以恢復系統的正常運行。
安全性:程序替換可以用于提高系統的安全性。當已知的程序存在安全漏洞時,可以通過替換為更安全的替代程序來減少潛在的風險。此外,通過替換系統默認的程序和工具,可以根據特定的安全需求進行定制。
自定義和個性化:通過程序替換,用戶可以根據自己的需求和喜好選擇和使用不同的程序。這使得用戶可以自定義系統的外觀、功能和行為,從而滿足個人化的需求。
總而言之,程序替換在Linux系統中具有重要的意義,它可以用于軟件更新、系統維護、安全性提升以及自定義和個性化等方面。它是維護和發展Linux系統的重要工具之一。
(本章完)