fork
位於unistd.h中
fork()會複製一個子process,和原process一模一樣,並且是由被呼叫的fork()的下一行開始執行
如果是child的fork(),會回傳0 ,如果是parent的fork(), 會回傳新創造的child的process id
注意child 會完全和parent共用一樣底層資源(register,file , program counter )
例一 : 指數增長的fork()
Q1:共有多少個process被執行?
A1: 8次
也可以換個角度,用從第幾個fork()產生的process就會變成二元樹
Q2: x 會有多少種可能?
A2: 一種 (x只會印1)
因為雖然資源相同,但不同process會有不同的記憶體,區域變數是不會共用的
例二 : parent or child
這是常用判斷child 還是 parent的條件式
有趣的點有兩個
- 即使child 繼承pid,也還是得到0
- child , parent 不一定誰先執行完 (兩者同時存在,看排程)
wait
上例中為了克服有趣的點2,也就是避免parent比child還早結束 (可能有非預期結果)
因此通常會為parent 加上wait()函式
位於sys/wait.h 中
例子
exec 系列
共有六個函式 位於unistd.h中
功能皆為以其他程式替代child的執行,因為C語言沒有overload,所以才會有六個以應付各種情況
通常參數會吃執行檔案、命令引數、環境變數
比如執行 ls -l ~/test
執行檔案為ls指令,也就是 “/usr/bin/ls”
命令引數為 “ls” , “-l” , “~/test” , NULL (以空格split的字串陣列,並且最後填NULL表示結束)
環境變數比如 char * env[] = {"PATH=/home/gateman", "USER=lei", "STATUS=testing", NULL};
變數命名規則
例子 : ls -l
重點1:
execlp在中途就修改程式,將其變更為ls,所以並不會印出"world”
重點2:
了解參數格式:
execlp的後綴p,讓參數可以不用加path,程式會主動至$PATH搜尋
命令引數的確就是一串string陣列最後接上NULL
fork-exec
這兩步驟指令可以說是unix系統大多數process誕生的方法
這裡先介紹process
process
program 是程式設計師所寫的code
process則是program 載入記憶體執行的狀態 (an instance of a computer program that is being executed)
一個process通常會記錄其 (使用ps指令可以觀察)
PID (獨特ID,也是其資訊記錄於/proc中的檔名)
PPID (parent pid)
TTY (屬於哪個terminal session)
UID (哪位使用者擁有)
ARGS (當下程式引數)
process結束時總是會給一個exit code
介於0~255可以表達結束的狀態
比如C/C++常用的return 0 就是正常結束
process誕生
透過fork - exec的步驟
比如執行ls指令
會先呼叫bash,然後fork一份bash的code,最後再exec ls指令
幾乎所有unix系統程式都是由init (PID==1) 這支程式所fork - exec 的
而init是開機後一定會啟動的一隻程式
由於是掌管系統的重要角色它甚至能忽略terminate的signal
如果parent先於child結束
若child已執行完畢,就會無法回收child的資源(pid table上仍有它),被稱為Zombie
若child仍在執行,被稱為orphan (通常被發現後會由init收養)
signal
process之間傳送訊息的方法
通常使用kill 函式傳送
(kill 雖然一開始被設計為關閉程式,但後來單純用於傳送signal)
可以使用kill -l 查看所有signal
真正意義上的kill (terminate the process) 是9號訊息
可以使用 kill -9 <pid>
也可以使用 kill -SIGKILL <pid> 或者 kill -KILL <pid>
當然最常用的傳送方式是Ctrl+C
參考資料
https://www.itread01.com/content/1546349244.html
https://ntust-csie-islab.github.io/107-OS-homework1/B10402113/
https://www.cntofu.com/book/46/linux_system/linuxxi_tong_bian_cheng_zhi_jin_cheng_ff08_wu_ff09.md
https://www.brianstorti.com/an_introduction_to_unix_processes/