在學習程序之前,先來了解下程序的執行環境。
main函式
程序總是從main函式開始執行的,我們程式設計時,程式執行也是從main函式執行的,它的原型如下:
int main(int argc, char *argv);
argc是命令列引數的數目,argv是指鎮陣列,即指向指標的指標,可以寫**測試一下:
#include
int main(int argc, char *argv)
{int i;
for(i=0; i(a)從main函式返回
(b)呼叫exit
(c)呼叫_exit
(2)異常終止
(a)呼叫abort
(b)由乙個訊號終止
在上面的正常終止中有exit和_exit,區別在於:_exit呼叫後立即進入核心;而exit則會先執行一些清除工作(包括呼叫執行各種終止處理程式,關閉所有標準i/o流等),然後在進入核心。它們定義如下:
#include
void exit(int status);
#include
void _exit(int status);
使用了不同的標頭檔案,因為exit是右ansi c說明的,而_exit是由posix.1說明的。
atexit函式
我們可以在程序中登記一些函式(最多32個),這些函式由exit呼叫。這樣的函式叫做終止處理程式(exit handler),有atexit函式來登記。這點看起來有點像類的析構函式。
#include
int atexit(void (*func)(void));
其引數是乙個函式位址。exit呼叫順序與登記順序相反,先登記後呼叫(像棧),同乙個函式可以被登記多次。
環境表
c程式由以下幾部分組成:
正文段:也叫**段,是cpu執行的機器指令。正文段一般可以共享的,且是唯讀的。
初始化資料段:也叫做資料段,包含程式中已經初始化的全域性變數和靜態變數。
非初始化資料段:也叫做bss段,包含未初始化的全域性變數和靜態變數,在程式執行之前有核心初始化為0。不在**中儲存器初始值,可以減小**的大小。
棧:自動儲存變數以及每次函式呼叫時所需儲存的資訊都放在此段中。每次函式呼叫時,其返回位址、以及暫存器中的變數都放在棧中。新被調的函式在棧上為其自動和臨時變數分配儲存空間。
堆:進行動態分配的變數。需要手動釋放。堆位於未初始化資料段的頂和棧底之間。
儲存器的分配:
可以參考這裡
setjmp和longjmp
在c語言中,可以使用goto語言(雖然不建議使用),但是goto語句不能跳躍函式。執行這個跳轉功能的函式時setjmp和longjmp。這兩個函式對於處理發生在很深的巢狀呼叫中的出錯情況非常好用。遞迴呼叫返回時只能返回到上一層函式,這兩個函式可以使其跳出遞迴呼叫。
Unix程序環境
1.快取 a.全快取 當填滿標準i o快取後才進行實際i o操作 b.行快取 當在輸入和輸出中遇到新行符時,標準i o庫執行i o操作 2.printf返回值表示成功輸入的字元個數,返回0表示沒有輸出任何字元。unix程序環境 1.int main int a rg c,char a rg v ar...
UNIX程序環境
當執行程式時,main函式時如何被呼叫的?c程式總是從main函式開始執行。當核心在啟動c程式時,在呼叫main之前先呼叫乙個特殊的啟動例程。可執行程式將 核心取得命令列引數和環境變數,然後為呼叫main函式做好安排。程序的終止 1 正常終止 a 從main返回 b 呼叫exit c 呼叫 exit...
Unix程序環境之3 程序環境列表
1 程序環境 簡介當乙個程序 proecss 呼叫另乙個程式 program 時,同時會傳遞這個程式執行的環境列表 environment list 程序環境列表是乙個字元指標陣列,每個字元指標是乙個以空字元 null terminated 結束的c 字串。字元指標陣列位址包含在全域性變數envir...