Linux系統程式設計(8) 程序控制 程式替換

2021-09-22 14:10:31 字數 1792 閱讀 9912

fork 建立的子程序,和父程序式共用乙個**塊的,而事實上我們更需要建立出的子程序能夠單獨執行乙份**。

程式替換不會建立新程序,也不會銷毀程序。

替換原理:

pcb程序不變,從虛擬位址空間通過頁表對映到實體地址空間,然後從磁碟的其他可執行檔案,替換**段和資料段。原有的堆,棧中的資料都不要了,根據新的**執行過程重新構建堆,棧的內容。(類似雙擊exe執行乙個程式的過程(作業系統的記載入器模組))。

替換函式

有六種以exec開頭的函式,統稱exec函式。(引數有差異,底層原理完全相同)

#include

l  =>  list 變長引數列表     v  => vector  陣列    

p =>  path,自動從path目錄中找可執行目錄,類似我們直接敲命令就可用     e => 

execl("/usr/bin/ls", "/usr/bin/ls", "/", null);       //含義:ls  /    (ls   根目錄)
最後乙個引數必須是null,如果不填程式就是未定義行為。

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函式輸乙個阻塞式函式...