main函式之前會有乙個特殊的啟動程式,啟動例程從核心取得命令列引數和環境變數。
正常終止:從main函式返回呼叫exit
呼叫_exit或_exit
最後乙個執行緒從啟動例程返回
最後乙個執行緒呼叫pthread_exit
異常終止:
呼叫abort
接到乙個訊號終止
最後乙個執行緒對取消請求作出相應
exit函式
_exit和_exit直接進入核心,exit則先執行一系列清理處理(呼叫終止處理程式,關閉所有標準io流),然後進入核心
#include
void exit(int status);
void _exit(int status);
#include
void _exit(int status);
status 終止狀態
atexit函式
登記函式
#includeint atexit(void (*func)(void));
exit呼叫這些函式的順序與它們登記的順序相反,登記多次也將執行多次
呼叫exec的程序可將命令列引數傳遞給該新程式。
正文段:cpu執行的機器指令部分。可共享初始化資料段:明確的賦初值的變數。
非初始化資料段:bss段,任何程式外的c宣告
棧:自動變數以及每次函式呼叫時需要儲存的資訊
堆:動態儲存的分配
size命令報告報告正文段/資料段/bss段
動態鏈結
#includevoid *malloc(size_t size);
void *calloc(size_t nobj,size_t size);
void *realloc(void *ptr,size_t newsize);
void free(void *ptr);
#includechar *getenv(const char *name);
應使用geienv函式獲取指點環境變數的值,而不是直接使用environ。
設定環境變數時只會影響當前程序及呼叫的子程序的環境,但不影響父程序的環境。
#include
int putenv(char *str);
int setenv(const char* name,const char *value,int rewrite);
int unsetenv(const char *name);
putenv將字串直接放到環境表中,如果是自動變數會出現錯誤,
setenv分配儲存區
修改現有的name
增加新的name
goto是不能跨越函式的,只能在函式內部蹦達#include
int setjmp(jmp_buf env);
void longjmp(jmp_buf env,int val);
首先,用setjmp定位要跳到什麼地方,setjmp返回的是longjmp第二個引數指定的數值,可以用來指定跳轉意圖。
env一般宣告為全域性變數,儲存呼叫longjmp時能用來恢復棧狀態的所有資訊。
Unix程式設計第7章 程序環境
準備雄心勃勃的看完apue,但是總感覺看著看著就像進入一本字典,很多地方都是介紹函式的用法的,但是給出例子遠不及函式介紹的多。而且這本書還是個大部頭呢。第7章的講的程序環境,程序是程式設計中乙個比較重要的概念,知道倒是知道它的大概意思,但是其實還是有很多的細節其實都沒有深究,這章呢apue就帶著我們...
APUE 第7章 程序環境 學習筆記
1 exit函式先執行乙個標準的io庫的清理關閉操作 呼叫fclose函式關閉所有的流,使得所有的緩衝資料被沖洗 然後呼叫 exit或是 exit 2 atexit函式,用來等級終止處理程式,經過登記的函式,在程序退出的時候,會被逆序呼叫 void atexit void func void 3 核...
第 3 章 程序
程序是現代分時作業系統的工作單元。程序是資源分配的基本單位。執行緒是程式執行的最小單位。程序是執行的程式,這是一種非正式的說法。程序不只是程式 也稱文字段 程序還包括資料 程式計數器的值和處理器暫存器的內容等 程序堆疊 包括臨時資料,如函式引數 返回位址和區域性變數 和資料段 包括全域性變數 和堆。...