cha7 程序環境

2021-09-29 03:50:10 字數 4163 閱讀 3536

一、main()函式

1.函式原型int main(int argc, char *ar**)

2.引數:argc:命令列引數的數目;ar**:指向引數的各個指標構成的陣列

二、程序終止

1.有8種程序終止方式,5種正常終止,3種異常終止

(1)正常:

a.從main()函式返回

b.呼叫exit:先執行清理處理(標準i/o庫的清理關閉,對所有開啟流呼叫fclose()),後返回核心

: void exit(int status);

c.呼叫_exit/_exit:立即進入核心

: void _exit(int status)

: void _exit(int status)

d.最後乙個執行緒從其啟動歷程返回

e.從最後乙個執行緒呼叫pthread_exit

(2)異常:

a.呼叫abort

b.接到乙個訊號

c.最後乙個執行緒對取消請求做出響應

2.退出函式:

(1)main()

返回乙個整型值

==用該值呼叫

exit()

;exit(0) == return 0;

(2)終止狀態:exit status;shell命令echo $?輸出終止狀態

a.未知:呼叫返回函式不帶終止狀態;main()執行了無返回值的return語句;main()未宣告返回型別為整型

b.為0:main()返回型別為int,並且main()返回

3.atexit():登記終止處理程式(exit()自動呼叫)

(1)header:

(2)int atexit(void (*func) (void));

(3)parameter: 函式位址

(4)成功返回0,不成功返回非0

(5)exit()呼叫這些函式順序與他們登記順序相反,多次登記多次呼叫

(6)核心使程式執行的唯一方法:呼叫exec();程序自願終止唯一方法:顯式/隱式(呼叫exit())的呼叫_exit()/_exit()

三、命令列引數

1.ar**[argc]要求為空指標

四、環境表

1.對於函式staticextern的區別:static使得函式旨在本檔案內部有效,對其他檔案不可見,靜態函式extern表示函式為外部函式,可供其他檔案呼叫,使用其他檔案中定義的外部函式,使用extern宣告即可

4.iso c規定main()只能有兩個引數,posix.1規定應使用environ代替環境表位址

五、c程式的儲存空間布局

1.c程式組成部分:

(1)正文段:右cpu執行的機器指令部分,可共享,唯讀

(2)初始化資料段:包含了程式中需要明確賦初值的變數(任何函式之外的宣告)

(3)未初始化的資料段(bss):程式開始執行前,核心將此段的資料初始化為0/空指標

(5)堆:動態儲存分配(位於bss和棧之間)

2.存放在磁碟程式檔案中的:正文段,初始化資料段

3.linux-size命令報告正文段、資料段、bss段長度

六、共享庫

1.使得可執行檔案不再需要包含公用的庫函式,只需在所有程序都可引用的儲存區中儲存這種庫例程的乙個副本

2.程式第一次執行/第一次呼叫某個庫函式,用動態鏈結的方法將程式與共享庫函式相鏈結

七、儲存空間分配

1.iso c說明了3個用來動態分配儲存空間的函式

(1)malloc():分配指定位元組的儲存區,初始值不確定

void *malloc(size_t size);

(2)calloc():為指定數量、長度的物件分配儲存空間,每一位都初始化為0

void *calloc(size_t nobj, size_t size);

(3)realloc():增加/減少之前分配區的長度

void *realloc(void *ptr, size_t newsize);

void free(void *ptr);

(4)返回值:成功:非空指標;失敗:null

2.替代的儲存空間分配程式:libmalloc, vmalloc, quick-fit, jemalloc, tcmalloc, alloca

(1)alloca():在當前函式的棧幀上分配儲存空間,而不在堆中

a.優點:函式返回,自動釋放它使用的棧幀

b.缺點:增加了棧幀的長度

八、環境變數(name = value)

1.char *getenv(const char *name);取環境變數的值

(1)標頭檔案:

2.iso c 沒有定義任何環境變數

3.設定環境變數函式:

(1)int putenv(char *str);

a.取形式為name = value的字串,放到環境表中,如果name已存在,先刪除其原來的定義

b.成功返回0,否則返回非0

c.可以自由地將傳遞給他的字串直接放到環境中

(2)int setenv(const char *name, const char *value, int rewrite);

a.將name設定為value. 如果name已存在,先刪除現有定義(rewrite != 0),不刪除舊值也不賦新值

b.需要分配儲存空間

(3)int unsetenv(const char *name);

a.刪除name的定義,不存在也不出錯

4.環境表和環境字串通常存放在程序儲存空間的頂部

(1)增加乙個字串比較困難。因為占用頂部,不能再向更高位址擴充套件;下面是棧幀,也無法向更低位址方向擴充套件

九、函式setjmp()和longjmp():處理發生在深層巢狀函式呼叫中的出錯情況,程序中非區域性轉移

1.goto語句不能跨越函式,setjmp和longjmp為非區域性(在棧上跳過若干呼叫幀,返回到當前函式呼叫路徑上的某個函式中)goto

2.(1)int setjmp(jmp_buf env);放在需要返回的上層函式中

a.直接呼叫(將所需的資訊記入變數

env),返回0;從longjmp返回,返回非0

b.在希望返回到的位置呼叫setjmp()

c.jmp_buf是某種形式的陣列,存放在呼叫longjmp時能用來恢復棧狀態的所有資訊

d.需要在另乙個函式中引用env,通常將env定義為全域性變數

(2)void longjmp(jmp_buf env, int val);放在發生錯誤的下層函式中

a.檢查到錯誤時,呼叫long_jmp()

b.val值非0,作為setjmp()的返回值,區分多個longjmp()

3.longjmp()返回後,變數的值未知

十、函式getrlimit()和setrlimit():查詢/更改程序的資源限制

1.int getrlimit(int resource, struct rlimit *rlptr);

int setrlimit(int resource,  const struct rlimit *rlptr);

(1)成功返回0,否則非0

7程序環境

8忠方式使程序終止 五種正常終止 1,從main返回 2,呼叫exit 3,呼叫 exit或 exit 4,最後乙個執行緒從其啟動例程返回。5,最後乙個執行緒呼叫pthread exit。異常終止有3種方式 6,呼叫abort 7,接到乙個訊號並終止 8,最後乙個執行緒對取消請求做出響應。exit函...

Unix環境高階程式設計筆記 7 程序環境

1 程序終止 a 程序終止的8種方式 從main返回 呼叫exit 呼叫 exit或 exit 最後乙個執行緒從其啟動程序返回 最後乙個執行緒呼叫pthread exit 呼叫abort 接到乙個訊號並終止 最後乙個執行緒對取消請求做出響應 b exit函式 exit和 exit立即進入核心,exi...

第7章 程序環境

main函式之前會有乙個特殊的啟動程式,啟動例程從核心取得命令列引數和環境變數。正常終止 從main函式返回 呼叫exit 呼叫 exit或 exit 最後乙個執行緒從啟動例程返回 最後乙個執行緒呼叫pthread exit 異常終止 呼叫abort 接到乙個訊號終止 最後乙個執行緒對取消請求作出相...