1) exit函式先執行乙個標準的io庫的清理關閉操作:呼叫fclose函式關閉所有的流,使得所有的緩衝資料被沖洗;然後呼叫_exit或是_exit;
2) atexit函式, 用來等級終止處理程式,經過登記的函式,在程序退出的時候,會被逆序呼叫;
void
atexit
(void
(*func)
(void))
;
3) 核心使程式執行的唯一方法是呼叫exec函式,程序退出的唯一方法是呼叫_exit, _exit ;
環境表和命令列參數列都是字元陣列指標, 每個指標指向乙個字串,該字串以null結尾
char
** ar**;
char
** environ[
];
1) 程式空間分布
正文段:共享、唯讀;
初始化資料: 函式外定義的,區域性靜態變數, 有初始值;
非初始化資料段:無初始值
棧:區域性變數、呼叫函式位址、呼叫者的環境資訊(某些暫存器的值);
棧內部分為棧幀,注意遞迴函式沒呼叫一次自身,就要使用乙個新的棧幀;棧幀的存在,使得乙個函式呼叫中的變數例項不會影響另外乙個函式例項中的變數;
堆:動態儲存分配的空間;
2) 程式正文和初始化的資料段存放在磁碟上,由exec程式讀入;未初始化的資料.bss段由exec分配並設定為0;(需要存放在磁碟上的檔案只有正文段和初始化資料段);
1) 可執行程式不用包含公用的庫例程, 只需要在所有程序可以引用的儲存區維護乙個庫例程的副本;
2)共享庫的優點是更新庫例程的時候只需要重新鏈結,不需要重新編譯使用者程式,前提是庫例程的函式介面不變;
gcc -
static hello.c
gcc hello.c
1) malloc(size):儲存器的初始值不確定
2) calloc(nobj, size) :儲存區的初始值為0;
3) realloc(ptr, newsize):儲存區的初始值不確定,儲存器實際記憶體位址可變,不能讓任何指標指向該儲存區;
三個函式返回的型別都是void *, 並且是適當對齊的,這樣就可以用於任何資料型別;
4) void *資料型別可以自動轉化為其他不同型別的指標;
5) free釋放空間,但實際上只是將儲存空間送到可用儲存區,即malloc池而不是返回核心;
記憶體分配函式實際上呼叫的是sbrk系統呼叫。sbrk系統呼叫擴充、縮小程序的儲存空間;
6)分配的儲存空間,還附加有儲存空間管理記錄區,在儲存空間頭部;
7) 忘記呼叫free函式,程序的儲存空間一直增長,導致過度的分頁開銷,使效能下降;
1) 環境變數存放在environ中,不能直接訪問environ,而是應該呼叫函式getenv
char
*getenv
(const
char
*name)
;int
putenv
(char
*str)
;//新增環境變數
intsetenv
(const
char
*name,
const
char
*value,
int rewrite)
;int
unsetenv
(const
char
*name)
;//刪除環境變數
2) 環境變數存放在程序空間位址的頭部, 向上和向下都不能增長;因此對於putenv函式新增環境變數,具體的底層實現會很複雜;
1) goto函式是在乙個函式內部進行跳轉, setjmp 和longjmp是非本地跳轉,在呼叫函式中跳轉(每乙個呼叫函式都建立乙個棧幀,在棧幀間跳轉);
2)需要用乙個全域性變數jmp_buf jmpbuffer;(主函式和子函式都要訪問,所以是全域性變數;jmpbuffer是某種形式的陣列,其中存放呼叫longjmp時用來恢復棧狀態的所有資訊;
3) 使用非本體跳轉後, 自動變數和儲存器狀態是不確定的;即,子函式呼叫longjmp後返回主函式,你不能確定此時程式的自動變數和環境變數是子函式時候的值,還是主函式時候的值;如果你想保持子函式中的自動變數不變,就將自動變數宣告為volatile;
4) 在呼叫longjmp之後, 存放在儲存器中的變數將具有longjmp時候的值, 而在cpu和浮點暫存器中的變數將恢復到setjmp時候的值;
5) 要編寫乙個使用非區域性跳轉的可移植程式,必須使用volatile屬性的變數;
1)每個程序都有一組資源限制,程序資源限制通常是由程序0建立,由後面的程序繼承;
struct rlimit
;
2)更改資源限制的三個規則
任何乙個程序可以將軟限制值改為小於硬限制值的值;
任何乙個程序可以降低硬限制值,但是這個值必須大於軟限制值,並且只可以改小,不可以改大;
只有超級使用者可以提高硬限制值;
3) 程序擁有的資源限制有:看課本
4) 資源限制影響呼叫執行緒並由子程序繼承。意味著,為了影響乙個使用者的所有後續程序,需要將資源限制的設定構造在shell之中;
5) 常量rlim_infinity指定了乙個無線量的限制值;
第7章 程序環境
main函式之前會有乙個特殊的啟動程式,啟動例程從核心取得命令列引數和環境變數。正常終止 從main函式返回 呼叫exit 呼叫 exit或 exit 最後乙個執行緒從啟動例程返回 最後乙個執行緒呼叫pthread exit 異常終止 呼叫abort 接到乙個訊號終止 最後乙個執行緒對取消請求作出相...
Unix程式設計第7章 程序環境
準備雄心勃勃的看完apue,但是總感覺看著看著就像進入一本字典,很多地方都是介紹函式的用法的,但是給出例子遠不及函式介紹的多。而且這本書還是個大部頭呢。第7章的講的程序環境,程序是程式設計中乙個比較重要的概念,知道倒是知道它的大概意思,但是其實還是有很多的細節其實都沒有深究,這章呢apue就帶著我們...
APUE讀書筆記 第9章 程序關係
第9章 程序關係 9.1 引言 每個程序都有乙個父程序 初始的核心程序並無父程序,也可以說其父程序就是它自己 當子程序終止時,父程序得到通知並能取得子程序的退出狀態 9.2 終端登入 終端可以是基於字元的終端 簡單的基於字元終端的圖形終端,或者是執行視窗系統的圖形終端 系統管理員建立通常名為 etc...