# 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():

Execvp():


### 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)