Linux 程序替換的簡單實現

2021-10-05 16:05:05 字數 2376 閱讀 7708

一、程序替換的定義

像我們一般寫的程序都是,建立子程序後,子程序執行的還是父程序的指令。這樣是很不方便的。所謂的程序替換就是乙個程序能夠去執行另乙份程式。也就是fork之後,子程序進行程序的替換,父程序繼續執行其指令,子程序就可以執行另乙份指令。

二、程序替換的方法

1、int execl();屬於庫函式

int execl(char* pathname,char* ar**0,char* ar**1,…,(char*)0);

pathname:需要替換的程式。

ar**0:與pathname的值相等

2、inr execv();屬於庫函式

int execv(char* pathname,char* ar**);

pathname:需要替換的程式

ar**:把後面的引數按照陣列的形式傳入

3、int execle();屬於庫函式

int execle(char* pathname,char* ar**0,…(char*)0,char* envp);

envp:可以傳遞環境變數。

4、int execve();系統呼叫

int execve(char* pathname,char* ar**,char* envp)

這個方法是最全的乙個方法,既可以傳遞環境變數也可以通過陣列將值傳入。

5、int execlp();屬於庫函式

int execlp(char* filename,char* ar**0,…(char*)0);

此函式與execl的區別是,第乙個引數是filename,不用給路徑也是可以的。方法加了p之後,就是可以在環境變數path的執行路徑下去搜尋這個檔案

6、int execvp();屬於庫函式

int execvp(char* filename,char* ar**);

這些函式統稱為exec函式,它們的作用是:用fork函式建立子程序後,子程序往往要呼叫一種exec函式以執行另乙個程式。當程序呼叫一種exec函式時,該程序執行的程式完全替換為新程式,而新程式則從其main函式開始執行。因為呼叫exec並不建立新程序,所以前後的程序id並未改變。exec只是用乙個全新的程式替換了當前程序的正文、資料、堆和棧段。這些exec函式使得unix程序控制原語更加完善,用exec可以執行新程式。exit函式和兩個wait函式處理終止和等待終止

三、execl函式的簡單演示

我們在系統上建立乙個檔案,裡面寫入**去完成程序的替換

#include

#include

#include

#include

intmain

(int argc,

char

* ar**)

exit(0);}

我們再建立乙個main.c來進行test.c的替換。

#include

#include

#include

#include

intmain()

}else

}exit(0);}

我們可以去單獨執行./test,也可以去執行./main。執行./main之後,結果如下所示:

我們發現裡面出現了這三行**:

ar**[0]

=./test

ar**[1]

= hello

ar**[2]

= world

這三行東西是test裡面的內容。我們還看到父程序列印了10次「i am father」。但是沒有「i am child」的出現,也就是這段**沒有執行

int i =0;

for(

; i <5;

++i)

這塊就進行了程序替換。指令集發生了變化,變成了test的指令集,原來父程序裡面的指令集就沒了,就被替換成了test的指令集。只要exec執行成功,這塊就會被替換成乙個新的指令集。原來的指令集就會被覆蓋掉。所以這塊的**是沒有執行的原因。

我們還發現兩個程序的pid是相等的,這也就意味這這兩個是乙個程序。

所以總結來說我們可以使用這個方法使得乙個程序去執行另乙個程序的**,只是執行的程式的指令集變了,程序是沒有變的,這塊並沒有去產生乙個新的程序

Linux 程序替換

當程序呼叫exec函式執行磁碟裡另乙個程式時,並不建立新程序,呼叫前後程序id並未改變,新程序的資料和 會替換掉物理記憶體中的資料段和 段,從而虛擬根據頁表找到的資料和 都會別替換成新的,所以當程序開始執行時,就要從要執行的程式開始執行。系統呼叫 int execve const char path...

Linux程序的程式替換

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

Linux 訊號,程序替換

概念 軟中斷訊號,用來通知程序發生了非同步事件。系統預先定義好的某些特定事件,訊號可以被傳送,也可以被接受,傳送和接受的主題都是程序。有以下條件可以產生訊號 在linux系統下定義了一些訊號 儲存位置為 乙個程序接收到訊號後的處理 如何修改訊號的響應方式?linux提供了一種系統呼叫 函式位址 si...