一、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.對於函式static和extern的區別: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 接到乙個訊號終止 最後乙個執行緒對取消請求作出相...