fork 建立的子程序,和父程序式共用乙個**塊的,而事實上我們更需要建立出的子程序能夠單獨執行乙份**。程式替換不會建立新程序,也不會銷毀程序。
替換原理:
pcb程序不變,從虛擬位址空間通過頁表對映到實體地址空間,然後從磁碟的其他可執行檔案,替換**段和資料段。原有的堆,棧中的資料都不要了,根據新的**執行過程重新構建堆,棧的內容。(類似雙擊exe執行乙個程式的過程(作業系統的記載入器模組))。
替換函式
有六種以exec開頭的函式,統稱exec函式。(引數有差異,底層原理完全相同)
#include
l => list 變長引數列表 v => vector 陣列
p => path,自動從path目錄中找可執行目錄,類似我們直接敲命令就可用 e =>
最後乙個引數必須是null,如果不填程式就是未定義行為。execl("/usr/bin/ls", "/usr/bin/ls", "/", null); //含義:ls / (ls 根目錄)
execlp("ls", "ls", "/", null); //含義:ls / (ls 根目錄)
//第乙個不用寫路徑,直接寫檔名,自動從path中尋找
//第二個 ls 替換 第乙個 ls
char* env = ;
execle("./aaa", "./aaa", null, env); //含義:ls /
//./aaa 是aaa.c檔案gcc生成的
char* env = ;
execv("/usr/bin/ls", ar**); //含義:ls -l /
//ar** 替換 /usr/bin/ls 的內容
引數中:path:路徑 arg:命令列引數 fie:檔名
返回值:
這些函式如果呼叫成功則載入新的程式從啟動**開始執行,不再返回。
如果呼叫出錯則返回-1,所以exec函式只有出錯的返回值而沒有成功的返回值。
程式替換經常搭配fork來使用,一旦替換,就會把原來的**和資料都乾掉,無法繼續執行原來的**。
#include#include#include#includeint main()
; execle("./aaa", "./aaa", null, env); //含義:ls / //./aaa 是aaa.c檔案gcc生成的
//結果是 bbb
char* env = ;
execv("/usr/bin/ls", ar**); //含義:ls -l /
} //father
wait(null);
printf("after execl\n");
system("pause");
return 0;
} 檔案中的內容
#include#includeint main()
Linux系統程式設計 程序控制
for 函式使用 include include include int main void else if pid 0 else if pid 0 return 0 正確建立n個子程序 include include include int main void else if pid 0 else...
Linux系統程式設計 程序控制 三
使用fork或vfork建立子程序以後,子程序呼叫exec函式來執行另外乙個函式。exec函式族 include int execve const char path,char const argv,char const envp int execv const char path,char con...
Linux系統程式設計(7) 程序控制 程序等待
程序等待 父程序對子程序進行程序等待,等待是為了讀取子程序的執行結果 標頭檔案 include include pid t wait int status 返回值 成功返回被等待程序pid,失敗返回 1。引數 輸出型引數,獲取子程序退出狀態,不關心則可以設定成為null wait函式輸乙個阻塞式函式...