# 常用System Call ###### tags: `IT鐵人` 前面提到了OS會提供許多API給User執行,讓User可以切換成kernel mode執行程式,以下介紹幾個System Call。 ## fork()  此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。  之前杰哥修OS的時候,就因為作業內容需要執行許多fork()指令,但又有許多人忘記wait(),導致工作站的PID被占用光了,以至於後來的同學要登入工作站,會發生因為沒有多的PID可以分配而無法登入,每年的那段時間都要定期清除所有process,可以說相當有趣。 另外,如果parent沒有執行wait()就結束,child此時沒有parent,就成了孤兒(orphan),不過放心,OS會接納他們,並且定期把他們殺了。  ## execlp() 用來載入特定的binary code file到memory中執行,他有許多不同的類型可以使用,根據路徑、參數的傳遞方式,在[man7](https://man7.org/linux/man-pages/man3/exec.3.html)的頁面可以看到有以下幾種:  除了用法不一樣以外,功能是沒有差別的。 ## getpid() 名字簡單明瞭吧,就是告訴你自己的pid是多少而已,就像是告訴你你是誰這樣子。  ## 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) 
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.