exce函式組和fork函式

2021-09-30 11:49:39 字數 2459 閱讀 4407

exce函式組

(1)exec函式族說明

fork()函式用於建立乙個子程序,該子程序幾乎複製了父程序的全部內容;exec函式族可以用來在乙個程序中啟動另乙個可執行檔案,該可執行檔案將代替當前程序的執行映像(包括原呼叫程序的資料段、**段和堆疊段)。該呼叫並沒有生成新的程序,而是在原有程序的基礎上,替換原有程序的正文,呼叫前後是同乙個程序,除了程序號pid不變,其他全部被新的程序替換了。這裡的可執行檔案既可以是二進位制檔案,也可以是linux下的任何可執行的指令碼檔案。

(2)exec函式族語法

所需標頭檔案:

#include

六種呼叫形式:

int execl(const char *path, const char *arg, ...)

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

int execle(const char *path, const char *arg, ..., char *const envp)

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

int execlp(const char *file, const char *arg, ...)

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

函式返回值:

-1:出錯

exec函式名對應位含義:

前4位:均為exec

第5位:l:引數傳遞為逐個列舉的方式,其語法為const char *arg

v:引數傳遞為構造指標陣列的方式,其語法為char *const ar**

第6位:e:可傳遞新程序環境變數

p:執行檔案查詢可以只給出檔名,系統就會自動按照環境變數"$path"所指定的路徑進行查詢

(3)exec函式族應用舉例

以下程式實現子程序執行可執行檔案,父程序顯示執行結果。

上**

#include#include #include #include int main(int argc,char *ar**);	

char **list;//不知道陣列大小,動態分配大小

list=(char **)malloc((argc+1)*sizeof(char *));

//list[0]="./t2";

for(index=0;index

fork()

fork()之前,只有乙個程序在執行這段**,但在這條語句之後,就變成兩個程序在執行了,這兩個程序的幾乎完全相同,

將要執行的下一條語句都是if(fpid<0)……

為什麼兩個程序的fpid

不同呢,這與

fork

函式的特性有關。

fork呼叫的乙個奇妙之處就是它僅僅被呼叫一次,卻能夠返回兩次,它可能有三種不同的返回值:

1)在父程序中,

fork

返回新建立子程序的程序id;

2)在子程序中,

fork返回0

;3)如果出現錯誤,

fork

返回乙個負值;

在fork

函式執行完畢後,如果建立新程序成功,則出現兩個程序,乙個是子程序,乙個是父程序。在子程序中,

fork

函式返回

0,在父程序中,

fork返回新建立子程序的程序

id。我們可以通過

fork

返回的值來判斷當前程序是子程序還是父程序。

引用一位網友的話來解釋fpid

的值為什麼在父子程序中不同。

「其實就相當於鍊錶,程序形成了鍊錶,父程序的

fpid(p 

意味point)

指向子程序的程序

id,

因為子程序沒有子程序,所以其fpid為0.

fork出錯可能有兩種原因:

1)當前的程序數已經達到了系統規定的上限,這時

errno

的值被設定為

eagain

。2)系統記憶體不足,這時

errno

的值被設定為

enomem。

建立新程序成功後,系統**現兩個基本完全相同的程序,這兩個程序執行沒有固定的先後順序,哪個程序先執行要看系統的程序排程策略。

每個程序都有乙個獨特(互不相同)的程序識別符號(process id

),可以通過

getpid

()函式獲得,還有乙個記錄父程序

pid的變數,可以通過

getppid

()函式獲得變數的值。

#include #include #include #include int main(int argc,char *ar**)

else

printf("%d pid exit\n",getpid());

return 0;

}

fork 函式 fork 函式的使用

fork的意思是個叉子,在unix及其衍生版linux中,用於建立子程序,現在看一下fork函式的基本用法。include includeint main printf c b fflush stdout fork printf c c fflush stdout 上圖的輸出是什麼呢?答案是 bab...

c 中的fork函式 FORK()函式

乙個程序,包括 資料和分配給程序的資源。fork 函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。乙個程序呼叫fork 函式後,系統先給新的程序分配資源,例如儲存資料和 的空間。然後把原來的程序的所有...

fork函式 exec函式

fork 會產生乙個和父程序完全相同的子程序,出於效率考慮,linux中引入了 寫時複製 技術,也就是只有程序空間的各段的內容要發生變化時,才會將父程序的內容複製乙份給子程序。在fork之後exec之前兩個程序用的是相同的物理空間 記憶體區 子程序的 段 資料段 堆疊都是指向父程序的物理空間,也就是...