文章目錄
- 1. 行程等待的非阻塞模式
- 1.1 非阻塞模式
- 2. 行程程式替換
- 2.1 作用
- 2.2 原理
- 2.3 應用場景
- 2.3.1 守護行程
- 2.3.2 bash(命令列解釋器)
- 2.4 介面
- 2.4.1 exec函式簇
- 3. minishell
1. 行程等待的非阻塞模式
1.1 非阻塞模式
1.WNONHANG
2.搭配回圈使用
??回圈判斷條件:waitpid函式的回傳值
????0:表示沒有等到
????子行程的PID:表示等到了
2. 行程程式替換
2.1 作用
??將正在運行的行程,替換成為另外一個程式,運行另外一個程式的代碼,

2.2 原理
??行程程式替換就是將行程的代碼段,資料段替換成為新的程式的代碼段和資料段,更新堆疊資訊,
2.3 應用場景
2.3.1 守護行程

??守護行程本質上是為了提供7*24小時的服務,服務不間斷,但是,當子行程由于代碼崩潰退出之后,雖然父行程會立即重新啟動一個子行程,讓子行程進行程式替換,這塊我們需要注意,導致子行程退出的原因是崩潰,而崩潰的代碼并沒有修復,
2.3.2 bash(命令列解釋器)
2.4 介面
2.4.1 exec函式簇
1.int execl(const char *path,const char * arg,…);
??path:帶路徑的可執行程式(路徑+可執行程式名稱)
??arg:給待要替換的可執行程式傳遞引數
規定:
??1.第一個引數是可執行程式本身
??2.多個可執行引數,使用‘,’進行間隔
??3.引數的最后需要以NULL結尾
??…:可變引數串列
回傳值:
??替換成功之后,該函式是沒有回傳值,也不知道回傳值給誰,行程的PID和替換之前行程的PID一樣,只有替換失敗之后,才會有回傳值,回傳值小于0,
2.int execlp(const char *file, const char *arg,…);
引數:
??file:只需要傳遞待替換的可執行程式
注意:
??1.如果只傳遞可執行程式的名稱,則該可執行程式一定要在環境變數PATH當中可以找到,
??2.也可以將待替換的可執行程式的路徑寫全
??arg:同execl
??函式名帶有‘p’,則表示當前函式會自動搜索環境變數PATH
3.int execle(const char path, const char * arg, …, char * const envp[]);
??path:帶有路徑的可執行程式
??arg:同execl
??envp[]:指標陣列,本質上是陣列,陣列的每個元素都是一個
char,程式員需要自己組織環境變數,放到envp[]陣列當中,最后一個元素需要放入NULL,
??函式名稱帶有‘e’:則表示當前的execl函式,需要自己組織環境變數,放到envp指標陣列當中,以NULL結尾,
??函式名帶有‘l’:表示給待替換的可執行程式,傳遞的命令列引數為可變引數串列,
4.int execv(const char *path,char *const argv[]);
??path:帶有路徑的可執行程式
??argv[]:指標陣列
??命令列引數的陣列,存放的是傳遞給可執行程式的命令列引數
規則:
1.第一個引數是可執行程式本身
2.引數的最后需要以NULL結尾
??函式名當中帶有‘v’:表示給待替換的可執行程式傳遞的命令列引數為指標陣列
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
驗證方式:
??1.直接替換命令程式
??2.替換自己寫的程式
????2.1驗證PID是否變哈
????2.2驗證環境變數

3. minishell
??1.創建子行程
??2.父行程需要進行行程等待
??3.子行程進行行程程式替換成為命令程式
考慮:
??父行程需要進行回圈
??子行程
??ls -a -l
??區分命令程式和命令列引數
??行程程式替換
??execvp

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276303.html
標籤:其他
