1、為什麼需要exec函式
(1)fork子程序是為了執行新程式(fork建立了子程序後,子程序和父程序同時被os排程執行,因此子程序可以單獨的執行乙個程式,這個程式巨集觀上將會和父程序程式同時進行)
(2)可以直接在子程序的if中寫入新程式的**。這樣可以,但是不夠靈活,因為我們只能把子程序程式的源**貼過來執行(必須知道源**,而且源**太長了也不好控制),譬如說我們希望子程序來執行ls -la 命令就不行了(沒有源**,只有編譯好的可執行程式)
(3)使用exec族執行新的可執行程式(exec族函式可以直接把乙個編譯好的可執行程式直接載入執行)
(4)我們有了exec族函式後,我們典型的父子程序程式是這樣的:子程序需要執行的程式被單獨編寫、單獨編譯連線成乙個可執行程式(叫hello),(專案是乙個多程序專案)主程式為父程序,fork建立了子程序後在子程序中exec來執行hello,達到父子程序分別做不同程式同時執行的效果。
2、exec族的6個函式介紹
建立乙個子程序,在子程序中編寫如下**:
// 子程序
//execl("/bin/ls", "ls", "-l", "-a", null); // ls -l -a
//char * const arg = ;
//execv("/bin/ls", arg);
//execl("hello", "aaa", "bbb", null);
//char * const arg = ;
//execv("hello", arg);
//execlp("ls", "ls", "-l", "-a", null);
char
*const envp=
;execle
("hello"
,"hello"
,"-l"
,"-a"
,null
, envp)
;
(1)execl和execv 這兩個函式是最基本的exec,都可以用來執行乙個程式,區別是傳參的格式不同。execl是把引數列表(本質上是多個字串,必須以null結尾)依次排列而成(l其實就是list的縮寫),execv是把引數列表事先放入乙個字串陣列中,再把這個字串陣列傳給execv函式。
(2)execlp和execvp 這兩個函式在上面2個基礎上加了p,較上面2個來說,區別是:上面2個執行程式時必須指定可執行程式的全路徑(如果exec沒有找到path這個檔案則直接報錯),而加了p的傳遞的可以是file(也可以是path,只不過相容了file。加了p的這兩個函式會首先去找file,如果找到則執行執行,如果沒找到則會去環境變數path所指定的目錄下去找,如果找到則執行如果沒找到則報錯)
(3)execle和execvpe 這兩個函式較基本exec來說加了e,函式的引數列表中也多了乙個字串陣列envp形參,e就是environment環境變數的意思,和基本版本的exec的區別就是:執行可執行程式時會多傳乙個環境變數的字串陣列給待執行的程式。
3、execlp和execvp
(1)加p和不加p的區別是:不加p時需要全部路徑+檔名,如果找不到就報錯了。加了p之後會多幫我們到path所指定的路徑下去找一下。
4、execle和execvpe
(1)main函式的原型其實不止是int main(int argc, char **ar**)
,而可以是int main(int argc, char **ar**, char **env)
第三個引數是乙個字串陣列,內容是環境變數。
(2)如果使用者在執行這個程式時沒有傳遞第三個引數,則程式會自動從父程序繼承乙份環境變數(預設的,最早**於os中的環境變數);如果我們exec的時候使用execlp或者execvpe去給傳乙個envp陣列,則程式中的實際環境變數是我們傳遞的這乙份(取代了預設的從父程序繼承來的那乙份)
機器學習 邊角料
so phis tica teda lgor ithm sim plel earn inga lgor ithm goo dtra inin gdat a.z 11 exp z 注意一點,在神經網路引入sigmoid型函式的目的是避免,對權重乙個微小的改變可能對輸出帶來的顯著的改變,這一情況的發生 ...
MySQL的邊角料
1查詢對應資料庫所有的表 select from information schema.tables where table schema 資料庫名 2 查詢資料庫所有資料表的字段 select from information schema.columns where table schema 資...
linu應用邊角料4 linux環境變數在函式中
1 export命令檢視環境變數 2 程序環境表介紹.每乙個程序中都有乙份所有環境變數構成的乙個 也就是說我們當前程序中可以直接使用這些環境變數。程序環境表其實是乙個字串陣列,用environ變數指向它。宣告就能用,不用定義。include intmain void 3 程式中通過environ全域...