Linux系統程式設計 exec程序替換

2021-09-25 14:06:28 字數 1364 閱讀 8310

1、讓父子程序執行不相干的操作;也就是說,在乙個執行的程式a中,呼叫另外的應用程式b。

2、換核不換殼;exec族函式,能夠替換程序位址空間中的**段.text段(對應的堆、棧中的資料都會改變),重新填充新的**。

execl系列是變參函式

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);

execv系列是不變參函式

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

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

int execve(const char* path,char* const ar**,char *const envp);

引用標頭檔案:#include

在執行exec族函式之前需要先fork();

返回值:如果exec族函式執行成功,則不返回;如果執行失敗,列印錯誤資訊,退出當前程序。

帶p的函式:執行path環境變數能夠搜尋到的程式,不用寫全路徑,一般是系統應用程式,如命令ls等。

帶e的函式:執行指定目錄下的應用程式(自己寫全路徑),一般用來執行自己寫的程式。

不帶e和p的函式:執行指定目錄下的應用程式(自己寫全路徑),一般用來執行自己寫的程式。

引數有char *const envp的:需要自己指明環境變數(預設查詢路徑)在envp陣列中;比如:char* const ps_envp = 。

例1、讓父程序迴圈輸出1~10,子程序執行hello程式

int main()

; int i = 0;

for(;i < 10; i++)//父程序數數

pid = fork();

if(pid == 0)//子程序呼叫hello程式

int j = 0;

for(;j < 3; j++)

return 0;

}

例2、讓父程序迴圈輸出1~10,子程序執行ls命令

int main();	

int i = 0;

for(;i < 10; i++)//父程序數數

pid = fork();

if(pid == 0)//子程序呼叫ls

int j = 0;

for(;j < 3; j++)

return 0;

}

Linux系統程式設計 程序替換 exec 函式族

在 windows 平台下,我們可以通過雙擊執行可執行程式,讓這個可執行程式成為乙個程序 而在 linux 平台,我們可以通過.執行,讓乙個可執行程式成為乙個程序。但是,如果我們本來就執行著乙個程式 程序 我們如何在這個程序內部啟動乙個外部程式,由核心將這個外部程式讀入記憶體,使其執行起來成為乙個程...

Linux系統程式設計 程序替換 exec 函式族

在 windows 平台下,我們可以通過雙擊執行可執行程式,讓這個可執行程式成為乙個程序 而在 linux 平台,我們可以通過.執行,讓乙個可執行程式成為乙個程序。但是,如果我們本來就執行著乙個程式 程序 我們如何在這個程序內部啟動乙個外部程式,由核心將這個外部程式讀入記憶體,使其執行起來成為乙個程...

Linux系統程式設計 程序替換 exec 函式族

在 windows 平台下。我們能夠通過雙擊執行可執行程式。讓這個可執行程式成為乙個程序 而在 linux 平台。我們能夠通過.執行,讓乙個可執行程式成為乙個程序。可是,假設我們本來就執行著乙個程式 程序 我們怎樣在這個程序內部啟動乙個外部程式。由核心將這個外部程式讀入記憶體,使其執行起來成為乙個程...