1. 程式人生 > >【嵌入式Linux C程式設計】Linux程序控制程式設計

【嵌入式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函式取得子程序結束狀態。