程序程式替換

2021-09-27 03:26:27 字數 2028 閱讀 8780

程序程式替換並沒有建立新的程序

怎麼樣才算是新建了乙個程序?

建立好task_struct,再把task_struct插到雙向鍊錶裡面,這才是建立好了乙個程序。

所謂的程序程式替換就是把物理記憶體上的資料和**替換成了另外乙個磁碟上的可執行檔案的資料和**,說白了,我們前面寫的一些程式都是把它編譯成乙個可執行程式,乙個可執行檔案,而這個可執行檔案非得是通過「./檔名」的方式才能把它執行起來,這樣乙個執行的過程其實就是由作業系統把這個檔案裡面包含的資料和**載入到記憶體中的過程,程序程式替換它的這個替換和執行乙個程式它的乙個載入過程是非常類似的,意思是我們本來就有乙個程序,然後這樣乙個程序它有自己的**和資料,但是我想借助這個程序能夠去執行另外乙個可執行檔案中的**,就可以通過程式替換的方式來完成這一項操作。

所以說,程序程式替換是將原有程序的**和資料替換成新的可執行程式的**和資料。

exec函式族標頭檔案都是unistd.h

1、execl(l指list,可變引數列表)

int execl(const char *path, const char *arg, …);

其中,引數1表示路徑,就是你要替換的那個可執行程式的那個可執行檔案它的路徑是什麼;

後面是乙個變長引數列表,表示你要替換的那個可執行程式在啟動的時候要加上哪些的命令列引數。

由於行引數到底有幾個這個不確定,所以通過變長引數列表的形式來提供給我們使用者使用。

2、execlp(p表示的含義叫做環境變數path,表示path這個環境變數),p特指環境變數中的path,只是環境變數中的乙個。

int execlp(const char *file, const char *arg, …);

path裡面的內容是一組路徑,這組路徑是用來,當我們在終端下敲下乙個指令的時候,其實是要執行乙個可執行檔案,那這可執行檔案在哪個目錄下去查詢它,就在path包含的路徑中去查詢。

execlp意思是你在告訴程式呼叫哪乙個可執行檔案的時候,你不需要寫全路徑,只寫檔名就可以。

其中,引數1只寫乙個檔名就行,檔名怎麼對映到具體的完整路徑上,自動地從path中進行查詢。只要告訴檔名,就能自動地找到它的路徑。

3、execle(e表示的叫做環境變數),e代表著整體環境變數這個大的概念。

int execle(const char *path, const char *arg, … , char *const envp);

借助這個函式,可以讓呼叫者去手動設定即將要替換好的這個程式它的環境變數應該長成什麼樣子,所以有envp[ ]這個引數,這樣的乙個引數裡面就包含了若干的環境變數,那也就是說在呼叫這個函式的時候,就可以手動構造出乙個環境變數的陣列來,然後把這個陣列配置進去,那麼當程序程式替換完畢後,替換好的程序它的環境變數就變成了剛剛配置好的這樣乙個內容,即允許使用者手動設定環境變數。

4、execv(v表示vector,陣列)

int execv(const char * path, char *const ar**);

execv這三個函式都是通過ar**[ ]的形式來組織若干個命令列引數的

5、int execvp(const char *file, char *const ar**);

6、execve是系統呼叫,其餘5個都是庫函式,都是基於execve系統呼叫來實現的。

man第一頁是使用者指令,第二頁是系統呼叫,第三頁是庫函式。

程序程式替換

替換原理 用fork建立子程序後執行的是和父程序相同的程式,但有可能在執行不同的 分支,但是在實際情況中,我們通常希望子程序和父程序執行不同的程式,來提高效率,所以才有程式替換 子程序往往要呼叫一種exec函式用來執行另乙個程式,將 和資料替換為可執行檔案的 和資料,環境變數並不改變。當程序的使用者...

程序程式替換

因為父程序通過fork 建立的子程序,與父程序執行相同程式,當我們想讓子程序執行不同的程式時,就需要使用exec函式將子程序與新程式替換 程序程式替換需要注意幾點 exec 函式族 其中引數有差異,底層原理差不多相同 exrcl 中的l意為 list,這個exec函式是乙個可變引數列表的函式 函式功...

Linux程序的程式替換

程式替換 假如作業系統正在執行某乙個程式,我們可以利用程式替換函式指定乙個新的程式,讓作業系統去執行我們新指定的程式。也就是這樣一種情形下,我們fork乙個程序,如果fork成功,子程序會和父程序執行相同的 而我們建立子程序是希望子程序執行指定的操作,所以需要執行exec族函式。程式替換函式 程式替...