★進程相關概念程序員
(1)進程:是一個可以分配處理器並由處理器執行的,可以攜帶資源的活動實體。ide
(2)進程控制塊(PCB):每個進程中都有惟一的一個進程控制塊來保存進程的相關信息,實際PCB就是一個task_struct的結構體。具體的見http://10740590.blog.51cto.com/10730590/1785457函數
(3)進程狀態:進程是一個活動實體,並不表明進程是一直處於運行狀態,一個進程能夠有不少種狀態。spa
△R(running)表示運行狀態.net
△S(sleeping)表示可喚醒睡眠狀態線程
△D(disk sleep)表示不可喚醒的睡眠狀態3d
△T(stopped)表示暫停狀態blog
△t(tracing stop)表示終止狀態生命週期
△X(dead)表示死亡狀態進程
△Z(zombie)表示殭屍狀態
★進程建立執行
進程的建立有兩種方法:fork()和execve()。二者都是建立的進程都是運行進程的子進程,建立後的子進程會獲得父進程中的數據段、棧段、堆區域的一份拷貝,這些子進程都是能夠對其進行更改的,可是文本段是二者共享的,不能被子進程進行修改。
下面是fork的使用方法:
運行結果:
★進程終止
進程終止有如下幾種方式:
(1)從main函數返回
(2)調用exit函數
(3)調用_exit或_Exit;
(4)最後一個線程從啓動例程返回
(5)最後一個線程調用pthread_exit;
(6)調用abort函數
(7)接到一個信號並終止
(8)最後一個線程對取消請求作出相應
前5種爲正常終止,後三種爲異常終止。從main函數中return退出爲進程退出,由於沒有在繼續執行的代碼,可是在程序中間的任何位置return,不算是進程退出,只能算是程序調用結束。
exit返回:
exit()還讓return系統會強制刷新緩衝區,文件描述符
_exit()強制直接結束,不須要管其他的東西
_Exit()和_exit是相同的
★exit函數與atexit函數
(1)exit、atexit函數定義
頭文件:#include <stdlib.h> 頭文件:#include <stdlib.h>
void exit(int status); int atexit(void (*fun)(void));
一個進程能夠登記若干個函數,這些函數由exit自動調用,這些函數被稱爲終止處理函數,atexit函數就能夠登記這些函數。exit調用終止處理函數的順序和atexit登記的順序是相反的,若是一個函數能夠被屢次的登記,也能夠被屢次的調用。
運行結果:
★棧幀
1.堆棧
堆棧是C語言以及其餘語言運行時必須使用的一塊空間,它的主要做用是函數調用、傳遞參數、保存返回地址、提供局部變量空間的。
①堆須要程序員本身申請,而且須要顯示的進行釋放,申請和釋放必須是成對出現的,要否則就會出現內存泄漏,由於堆上的空間生命週期都是一直存在,直到手動進行釋放。而棧是系統自動進行分配的,回收也是進程運行結束時系統自動回收。
②堆的空間較大,棧的空間小,通常申請大的內存都在堆上。
2.棧幀的詳細解釋:http://blog.csdn.net/yxysdcl/article/details/5569351