UNIX程序環境

2021-09-08 14:50:58 字數 1479 閱讀 3556

當執行程式時,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...