當執行程式時,main函式時如何被呼叫的?
c程式總是從main函式開始執行。當核心在啟動c程式時,在呼叫main之前先呼叫乙個特殊的啟動例程。可執行程式將
核心取得命令列引數和環境變數,然後為呼叫main函式做好安排。
程序的終止
1 正常終止
a) 從main返回 b)呼叫exit c)呼叫_exit
exit先執行一些清理再進入核心。
2 異常終止
a) 呼叫abort b)由乙個訊號終止
在程式終止前可以呼叫其它函式,這可以通過int atexit (void (*function)(void));來設定程式正常結束前
呼叫的程式。最多可以登記32個這樣的函式。如果有多個,則以登記相反的順序來呼叫這些函式。這樣的
函式通常被稱為終止處理程式。
核心使程式執行的唯一方法是呼叫乙個exec函式。程序自願終止的唯一方法是顯示或隱式地呼叫exit函式。
環境表
每個程式都接收一張環境表。可以如下訪問環境表
extern char **environ;
for (int i=0; environ[i]; i++)
printf("%s\n", environ[i]);
c程式的儲存空間布局
正文段。程式本身,這是又cpu執行的機器指令部分。
初始化資料段。包含了程式中需賦初值的變數。
非初始資料段。包含未初始化的變數。
linux上測試好像不是這樣的:
char a=2;
char b;
char c=3;
printf("a:%x b:%x c:%x\n", &a, &b, &c);
輸出為:a:bfef9b8f b:bfef9b8e c:bfef9b8d
可見a, c並沒有放在一起。
棧
堆
size命令報告正文段、資料段和bss段的長度。
共享庫
共享庫使得可執行檔案中不再需要包含常用的庫函式(比如c標準庫),這將大大減少可執行檔案的長度。同時
共享庫還便於庫函式的版本更新,可以動態替換。
ldd 命令可一檢視可執行檔案依賴的庫。
環境變數
訪問環境變數的api
char * getenv(const char *name);
int putenv(const char * string);
int setenv(const char *name,const char * value,int overwrite);
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函式 程序總是從main函式開始執行的,我們程式設計時,程式執行也是從main函式執行的,它的原型如下 int main int argc,char argv argc是命令列引數的數目,argv是指鎮陣列,即指向指標的指標,可以寫 測試一下 inc...
Unix程序環境之3 程序環境列表
1 程序環境 簡介當乙個程序 proecss 呼叫另乙個程式 program 時,同時會傳遞這個程式執行的環境列表 environment list 程序環境列表是乙個字元指標陣列,每個字元指標是乙個以空字元 null terminated 結束的c 字串。字元指標陣列位址包含在全域性變數envir...