★進程相關概念
(1)進程:是一個能夠分配處理器並由處理器執行的,能夠攜帶資源的活動實體。
(2)進程控制塊(PCB):每一個進程中都有唯一的一個進程控制塊來保存進程的相關信息,實際PCB就是一個task_struct的結構體。具體的見http://10740590.blog.51cto.com/10730590/1785457
(3)進程狀態:進程是一個活動實體,並不代表進程是一直處於運行狀態,一個進程可以有很多種狀態。
△R(running)表示運行狀態
△S(sleeping)表示可喚醒睡眠狀態
△D(disk sleep)表示不可喚醒的睡眠狀態
△T(stopped)表示暫停狀態
△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