異常控制流中的程序控制
阿新 • • 發佈:2020-12-28
1.獲取程序ID
每個程序都有一個唯一的正數(非零)程序ID(PID)。
getpid函式返回呼叫程序的PID,getppid函式返回它的父程序PID。
2.建立和終止程序
呼叫exit函式來終止程序
父程序呼叫fork 函式建立一個新的執行的子程序。
fork函式只被呼叫一次,返回兩次:一次在呼叫程序(父程序)中,一次在新建立的子程序中。
例項:
int main{ pid_t pid; int x=1; pid=Fork(); if(pid==0){ printf("child:x=%d\n",++x); exit(0); } printf("parent:x=%d\n",--x); exit(0); }
在Unix系統上執行這個程式時,得到的結果:
linux>./fork
parent:x=0
child:x=2
學習fork函式,畫程序圖通常會有所幫助,程序圖是刻畫程式語句的偏序的一種簡單的前趨圖。
child:x=2
——>printf————>exit 子程序
|
x==1 | parent:x=0
main——>fork——>printf————>exit 父程序
程序圖特別有助於理解帶有巢狀fork呼叫的程式。
3.回收子程序
一個程序可以通過呼叫waitpid函式來等待它的子程序終止或者停止。
pid_t waitpid(pid_t pid,int *statusp,int options);
1.判定等待集合的成員
- 如果pid>0,那麼等待集合就是一個單獨的子程序,它的程序ID等於pid.
- 如果pid=-1,那麼等待集合就是由父程序所以子程序組成的。
2.修改預設行為
options
- WNOHANG:如果等待集合中的任何子程序都還沒有終止,那麼就立刻返回(返回值為0)。
- WUNTRACED:掛起呼叫程序的執行,直到等待集合中一個程序變成已終止或者被終止。
- WCONTINUEN:掛起呼叫程序的執行,直到等待集合中一個正在執行的程序終止或等待集合中一個被停止的程序收到SIGCONT訊號重新開始執行。
3.檢查已回收子程序的退出狀態
statusp
- WIFEXITED:如果子程序通過呼叫exit或者一個返回正常終止,就返回真。
4.wait函式
呼叫wait(&status)等價於呼叫waitpid(-1,&status,0)。