第7章 程序環境

2022-03-16 01:57:56 字數 2232 閱讀 8843

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函式

登記函式
#include

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

exit呼叫這些函式的順序與它們登記的順序相反,登記多次也將執行多次

呼叫exec的程序可將命令列引數傳遞給該新程式。

正文段:cpu執行的機器指令部分。可共享

初始化資料段:明確的賦初值的變數。

非初始化資料段:bss段,任何程式外的c宣告

棧:自動變數以及每次函式呼叫時需要儲存的資訊

堆:動態儲存的分配

size命令報告報告正文段/資料段/bss段

動態鏈結

#include

void *malloc(size_t size);

void *calloc(size_t nobj,size_t size);

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

void free(void *ptr);

#include

char *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 章 程序

程序是現代分時作業系統的工作單元。程序是資源分配的基本單位。執行緒是程式執行的最小單位。程序是執行的程式,這是一種非正式的說法。程序不只是程式 也稱文字段 程序還包括資料 程式計數器的值和處理器暫存器的內容等 程序堆疊 包括臨時資料,如函式引數 返回位址和區域性變數 和資料段 包括全域性變數 和堆。...