一、main函數數組
main 函數 C/C++ 程序的入口函數, 但並非進程真正開始執行的地方。main函數的原型:int main(int argc, char *[]argv)。其中,argc是命令行參數的數目,argv是指向參數的各個指針所構成的數組。編輯器
當內核執行C程序時(使用一個exec函數),在調用main前先調用一個特殊的啓動例程。可執行程序文件將此啓動例程指定爲程序的起始地址,這是由鏈接編輯器設置的,而鏈接編輯器則由C編譯器調用。啓動例程從內核取得命令行參數和環境變量,而後爲調用main函數作好安排。函數
二、進程終止佈局
有8種終止方式,正常終止(5種):spa
(1)從main返回。操作系統
(2)調用exit。命令行
(3)調用_exit或_Exit。線程
(4)最後一個線程從其啓動例程返回。指針
(5)最後一個線程調用pthread_exit。對象
異常終止(3種):
(1)調用abort。
(2)接到一個信號並終止。
(3)最後一個線程對取消請求作出響應。
在上面的正常終止中有exit和_exit,區別在於:_exit調用後當即進入內核;而exit則會先執行一些清除工做(包括調用執行各類終止處理程序,關閉全部標準I/O流等),而後在進入內核。
三、環境表
在Unix操做系統中,每個進程都包含一個環境列表(environment list),環境列表以數組的方式存儲,數組地址存儲在全局變量environ中,使用時需在文件中包含:
extern char** environ;
環境列表中的數據以"name=value"的方式存儲。
四、C程序的存儲空間佈局
C程序由如下幾部分組成:
正文段:也叫代碼段,是CPU執行的機器指令。正文段通常能夠共享的,且是隻讀的。
初始化數據段:也叫作數據段,包含程序中已經初始化的全局變量和靜態變量。
非初始化數據段:也叫作bss段,包含未初始化的全局變量和靜態變量,在程序執行以前有內核初始化爲0。不在代碼中存儲器初始值,能夠減少代碼的大小。(在可執行文件中不佔位置,程序運行前纔開闢並清0)
棧:自動存儲變量以及每次函數調用時所需保存的信息都放在此段中。每次函數調用時,其返回地址、以及寄存器中的變量都放在棧中。新被調的函數在棧上爲其自動和臨時變量分配存儲空間。
堆:進行動態分配的變量。須要手動釋放。堆位於未初始化數據段的頂和棧底之間。
五、共享庫
共享庫使得可執行文件中再也不須要包含公用的庫函數,而只需在全部進程均可引用的存儲區中保存這種庫的一個副本。程序第一次執行或者第一次調用某個庫函數時,用動態連接方法將程序與共享庫函數相連接。這減小了每一個可執行文件的長度,但增長了一些運行時間開銷。
六、存儲空間分配
malloc。分配指定字節數的存儲區。此存儲區中的初始值不肯定。
calloc。爲指定數量具指定長度的對象分配存儲空間。該空間中的每一位(bit)都初始化爲0。
realloc。更改之前分配區的長度。當增長長度時,可能需將之前分配區的內容移到另外一個足夠大的區域,以便在尾段提供增長的存儲區,新增區域內的初始值不肯定。
這3個分配函數所返回的指針是適當對齊的。
七、環境變量
八、函數setjmp和longjmp
在C中,goto語句是不能跨越函數的。而執行這種跳轉功能的是函數setjmp和longjmp。這兩個函數對於處理髮生在很深的嵌套函數調用中的出錯狀況很是有用。
int setjmp(jmp_buf env) ;
返回:若直接調用則爲0,若從longjmp返回則爲非0
void longjmp(jmp_buf env , int val) ;
應用:(1)容許從一個深層嵌套的函數調用中當即返回,而不是費力地解開調用棧;(2)使一個信號處理程序分支到一個特殊的代碼位置,而不是返回到被信號到達中斷了的指令的位置。