# Learning from OS Program Homework1 ###### tags: `OS Homework & Learning` [TOC] ## Execvp() System call 與 Execlp() System call 他們倆的功能都是在linux中用來執行執行檔的函數。 - 語法: int execlp(const char *file(or)command, const char *arg ... /* (char *) NULL */); int execvp(const char *[file](https://blog.csdn.net/u011857683/article/details/81160059)(or)command, char *const argv[]); - 標頭檔: #include <unistd.h> - 引數: file 是該即將被執行的檔案的名字,要的是const char* 這裡個file有三個重點 1. 如果file這個字串裡沒有斜線字元(/)的話,就從環境變數中PATH裡有的路徑去找 2. 如果file這個字裡面有斜線字元(/),會直接去該路徑找檔案,忽略PATH 3. execlp的file比較特別,要放兩次,第一個是執行檔名稱,第二個是process名稱 execlp後面的引數arg"不限數量",最後放一個NULL做為結尾,傳給file作為其引數 execvp後面的引數arg[],一樣是傳給file作為其引數,但要小心execvp裡arg[]的元素數量至少要比"file name"+"用到的arg"數量多一,多一個NULL **這裡的cat應該是執行檔,並且接收後面的arg。** Execlp(): ![](https://i.imgur.com/Oe4O9g5.png) Execvp(): ![](https://i.imgur.com/NCR1gpJ.png) ![](https://i.imgur.com/30cj1Bk.png) ### Const char* 與 char *const 的差別 - 一是限制「不可以改變地址本身」 - 二是限制「不可以透過地址去改變變數的內容」 **char * const p2 = &c; 限制不可以改變地址本身** **const char * p1 = &c; 限制不可以透過地址去改變變數的內容** **const char * const p3 = &c; 既不能改變地址本身,也不能透過地址去改變變數的內容** ## How to use waitpid **pid_t waitpid(pid_t pid,int *status,int options)*** 1. pid | 參數值 | 說明| | -------- | -------- | | pid<-1 | 等待進程組號為pid絕對值的任何子進程| | pid=-1 | 等待任何子進程,此時的waitpid()函數就退化成了普通的wait()函數| | pid=0 | 等待進程組號與目前進程相同的任何子進程,也就是說任何和調用waitpid()函數的進程在同一個進程組的進程。| | pid>0 | 等待進程號為pid的子進程。| 2. int *status 這個參數將保存子進程的狀態信息,有了這個信息父進程就可以了解子進程為什麼會推出,是正常推出還是出了什麼錯誤。如果status不是空指針,則狀態信息將被寫入器指向的位置。當然,如果不關心子進程為什麼推出的話,也可以傳入空指針。 3. int options 參數options提供了一些另外的選項來控制waitpid()函數的行為。如果不想使用這些選項,則可以把這個參數設為0。 如果waitpid()函數執行成功,則返回子進程的進程號;如果有錯誤發生,則返回-1,並且將失敗的原因存放在errno變量中。 失敗的原因主要有:沒有子進程(errno設置為ECHILD),調用被某個信號中斷(errno設置為EINTR)或選項參數無效(errno設置為EINVAL) 如果像這樣調用waitpid函數:waitpid(-1, status, 0),這此時waitpid()函數就完全退化成了wait()函數。 原文:https://blog.csdn.net/Roland_Sun/article/details/32084825 ## [Strcpy() vs Strdup()](https://www.itread01.com/article/1440470244.html) ## [C 語言字串分割函式 p = strtok(NULL, " ");](https://www.itread01.com/content/1546914791.html) 首次呼叫時,s必須指向要分解的字串,隨後呼叫要把s設成NULL。 strtok在s中查詢包含在delim中的字元並用NULL(’\0’)來替換,直到找遍整個字串。 返回指向下一個標記串。當沒有標記串時則返回空字元NULL。 ## [Direction 的介紹](https://thoughtbot.com/blog/input-output-redirection-in-the-shell) ## [Open&Create](https://blog.jaycetyle.com/2018/12/linux-fd-open-close/) ## [對於fork()發生的種種應用](https://burweisnote.blogspot.com/2017/09/fork.html) ## [好用的vfork()](https://www.mdeditor.tw/pl/2unR/zh-tw)