# 常用System Call ###### tags: `IT鐵人` 前面提到了OS會提供許多API給User執行,讓User可以切換成kernel mode執行程式,以下介紹幾個System Call。 ## fork() ![](https://i.imgur.com/6d4wCvV.png) 此system call可以建立child process,child process會被配置與parent不同的memory space(by kernel),他的資料內容都會來自於parent的copy。 fork()的回傳值有以下兩種: |類型|內容| |-|-| |失敗(無法建立child)|傳負值(-1)給kernel,kernel通知parent。| |成功|傳回0給child process。傳回大於0的值給parent,此數值極為child之PID(process id)。| 因此,如果child要做與parent相同之工作,則fork()即可完成目的。 ## exit() 用來終止程式,請kernel結束程式並且收回resource,可以決定要回傳甚麼數值給kernel。 通常exit(0)代表正常結束,exit(1)代表異常結束。 如果是child process執行exit(),則kernel會將數值回傳給parent process。 ## wait() 用來暫停process,直到某事件發生。 通常會讓parent執行wait(),等待child執行完再繼續執行。 如果child已經終止,但parent尚未執行wait(),這段期間kernel就不能清除child PCB,此段時間child就稱為zombie process。 ![](https://i.imgur.com/XFVIKrL.png) 之前杰哥修OS的時候,就因為作業內容需要執行許多fork()指令,但又有許多人忘記wait(),導致工作站的PID被占用光了,以至於後來的同學要登入工作站,會發生因為沒有多的PID可以分配而無法登入,每年的那段時間都要定期清除所有process,可以說相當有趣。 另外,如果parent沒有執行wait()就結束,child此時沒有parent,就成了孤兒(orphan),不過放心,OS會接納他們,並且定期把他們殺了。 ![](https://i.imgur.com/uiZCSbh.png) ## execlp() 用來載入特定的binary code file到memory中執行,他有許多不同的類型可以使用,根據路徑、參數的傳遞方式,在[man7](https://man7.org/linux/man-pages/man3/exec.3.html)的頁面可以看到有以下幾種: ![](https://i.imgur.com/ZPNFWMJ.png) 除了用法不一樣以外,功能是沒有差別的。 ## getpid() 名字簡單明瞭吧,就是告訴你自己的pid是多少而已,就像是告訴你你是誰這樣子。 ![](https://i.imgur.com/peW1mGL.png) ## What's Next? 因為下篇的篇幅可能比較長,這篇就到此為止,後面會介紹許多CPU Scheduling Algorithm,也就是怎麼分配大家使用CPU的時間才讓大家都滿意。 希望各位在疫情期間,可以安全地執行fork(),少產出一些child,最好不要有orphan,畢竟現在的zombie已經夠多了。 | 上一篇 | 下一篇 | |-|-| |[Child Process](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/SyQiqR8zF)|[CPU Scheduling Algorithm](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/H1ZwYW_mF) ![](https://i.imgur.com/x5gJpDM.jpg)