Skip to content

底層函式介紹 - process相關

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的條件式

有趣的點有兩個

  1. 即使child 繼承pid,也還是得到0
  2. 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/