【嵌入式Linux C程式設計】Linux程序控制程式設計
程序是一個具有一定獨立功能的程式的一次執行活動,同時也是資源分配的最小單元。
程序的生命週期:
建立:每個程序可以由父程序建立,程序可以建立子程序,子程序可以建立孫程序。
執行:多個程序可以同時存在,程序間可以通訊。
撤銷:程序可以撤銷,從而結束一個程序的執行。
程序的三種狀態:
就緒狀態(ready):程序具備一切條件,正在等到分配處理器時間片;
執行狀態(running):程序正在佔用cpu;
阻塞狀態(blocked):程序不能使用cpu,若等待時間發生,則將其喚醒。
Linux系統是一個多程序的系統,它的程序之間具有並行性
程序的地址空間:資料段、程式碼段、堆疊段。
資料段:存放的是全域性變數、常數以及動態資料分配的資料空間;
程式碼段:存放的是程式程式碼的資料;
堆疊段:存放的是子程式的返回地址、子程式的引數以及程式的區域性變數等。
程序ID是每個程序的唯一標示!
程序ID:PID; 獲取程序ID:getpid() ;
父程序ID:PID; 獲取父程序ID:getppid();
使用者ID:UID。
建立程序方法1——fork()函式
fork有3個返回值:
返回-1 表示建立失敗;
返回0 表示子程序;
返回其他 表示父程序;
int main() { pid_t pid; /*此時僅有一個程序*/ pid=fork(); /*此時已經有兩個程序在同時執行*/ if(pid<0) printf("error in fork!"); else if(pid==0) printf("I am the child process, ID is %d\n",getpid());//子程序 else printf("I am the parent process,ID is %d\n",getpid());//父程序 }
子父程序間存在寫時拷貝,而不是資源共享。舉個例項:
int main(void) { pid_t pid; int count=0; pid = fork(); if (0 == pid) { count++; printf( “count = %d\n", count ); } else if (pid > 0) { count++; printf( “count = %d\n", count ); } return 0; }
這段程式碼的執行結果是:
count = 1;
count = 1;
第二次的輸出並不是2。因為在父子程序在呼叫count時,分別拷貝了一份count原來的值,而不是後執行的程序使用先執行程序輸出的值。
建立程序方法2——vfork()函式
建立的過程及返回值與fork函式一致,但與之區別的是,由vfork建立的父子程序之間是共享資料的。沿用上個例項,講將fork換成vfork,輸出結果就變成了:
count = 1;//子程序輸出的結果
count = 2;//父程序輸出的結果
而且,fork執行時父子程序的先後順序是隨機的,vfork執行父子程序是子先父後。
為避免fork的父程序在子程序結束前先結束,導致子程序成為孤兒程序,出現一些異常的效果,可以在父程序的後面加一個wait函式:wait(&status)。它的作用是阻塞該程序,直到他的子程序結束,並且回收子程序的資源。
退出程序
exit()用來正常終結目前程序的執行,並把引數status返回給父程序,而程序所有的緩衝區資料會自動寫回並關閉未關閉的檔案。
_exit()用來立刻結束目前程序的執行,並把引數status返回給父程序,並關閉未關閉的檔案。
此函式呼叫後不會返回,並且會傳遞SIGCHLD訊號給父程序,父程序可以由wait函式取得子程序結束狀態。