---
# System prepended metadata

title: Learning from OS Program Homework1
tags: [OS Homework & Learning]

---

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