Unix環境高階程式設計 讀書筆記 第七章 程序環境

2021-09-07 03:39:31 字數 3323 閱讀 4272

在c語言中,main函式的原型為:

int

main

(int argc,

char

*argv)

;

argc是命令列引數的數目,argv是指向命令列引數的各個指標所組成的陣列。

當核心在執行c程式時,在呼叫main函式之前會呼叫乙個特殊的啟動例程,可執行程式檔案將此啟動例程指定為程式的起始位址。

啟動例程從核心取得命令列引數和環境變數值,為呼叫main函式作好準備。

程序終止具有5種正常終止方式:

從main返回;

呼叫exit;

呼叫_exit或者_exit;

最後乙個執行緒從其啟動例程返回;

最後乙個執行緒呼叫pthread_exit。

程序終止具有3種異常終止方式:

呼叫abort;

接到乙個訊號;

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

具有3個函式用於正常終止乙個程式:

#include

void

exit

(int status)

;void

_exit

(int status)

;#include

void

_exit

(int status)

;

其中exit函式總是執行乙個標準io庫的清理關閉操作:對所有開啟流呼叫fclose函式,造成輸出緩衝中所有的資料都被沖洗到檔案上。

以上的3個函式都帶乙個整型的引數,為終止狀態或者退出狀態。對於以下情況,程序的終止狀態是未定義的:

呼叫exit系列函式時不帶終止狀態;

main函式執行了乙個無返回值的return語句;

main函式沒有宣告返回型別為整型。

函式atexit提供了註冊終止處理程式的功能,這些被註冊登記的終止處理程式將由exit函式自動呼叫。

#include

intatexit

(void

(*func)

(void))

;/*若成功,返回0,若出錯,返回非0*/

exit呼叫這些函式的順序與其登記時候的順序相反。

每個程式都對應一張環境表,環境表是乙個字元指標陣列,其中每個指標包含乙個以null結尾的c字串位址。

全域性變數environ包含該指標陣列的位址,稱environ為環境指標。指標陣列為環境表,各個指標指向的字串為環境字串。

典型的儲存空間布局安排為:

正文段,即text段,是cpu執行的機器指令部分,可共享;

初始化資料段,即data段;

未初始化資料段,即bss段,名稱起源於早期彙編中的block started by symbol,在程式執行之前,由核心將此段中的資料初始化為0或者空指標;

棧,自動變數和每次函式呼叫所需儲存的資訊都存放在此段中;

堆,在堆中進行動態儲存分配。

系統提供了3個用於儲存空間動態分配的函式,以及1個用於空間記憶體釋放的函式:

#include

void

*malloc

(size_t size)

;void

*calloc

(size_t nobj, size_t size)

;void

*realloc

(void

*ptr, size_t newsize)

;/*若成功,返回非空指標,若出錯,返回null*/

void

free

(void

*ptr)

;

malloc函式分配指定位元組數的儲存區,分配的儲存區的初始值不確定。

calloc函式為指定數量指定長度的物件分配儲存空間,儲存空間資料會被初始化為0。

realloc函式增加或者減少之前分配的儲存空間大小。新增的儲存空間資料初始值不確定。

free函式釋放ptr指向的儲存空間。

大多數的實現所分配的儲存空間比所要求的要稍微大一些,額外的空間用來記錄管理資訊,包括分配塊的長度,指向下乙個分配塊的指標等資訊。

如果超過乙個分配塊的尾端或者在已分配塊起始位置之前進行寫操作,則可能會改寫另一塊分配塊的管理資訊資料,或者其他動態分配的物件資料,這樣的錯誤是災難性的,且不易排查。

系統定義了1個函式getenv,可以用其取環境變數的值:

#include

char

*getenv

(const

char

*name)

;/*返回指向與name相關的value的指標,若未找到,返回null*/

應當使用函式getenv從環境中取乙個指定的環境變數的值,而不是直接訪問全域性變數environ。

有時候不僅需要獲取環境變數的值,也需要設定環境變數的值,可能是希望改變某個現有環境變數的值,或者是新增環境變數。系統提供了呼叫函式來實現:

#include

intputenv

(char

*str)

;/*若成功,返回0,若出錯,返回非0*/

intsetenv

(const

char

*name,

const

char

*value,

int rewrite)

;int

unsetenv

(const

char

*name)

;/*若成功,返回0,若出錯,返回-1*/

函式putenv取形式為name=value的字串,將其放入環境表中。若name已經定義,則刪除原先的定義。

函式setenv將環境變數name設定為value,若name已經定義,則由引數rewrite來絕對是否刪除原先的定義,若rewrite為0,則不刪除原先定義,若rewrite非0,則刪除原先的定義。

函式unsetenv刪除環境變數name,即使原先不存在環境變數name,也不出錯。

unix 環境高階程式設計 讀書筆記

unix環境高階程式設計 讀書筆記 第8章exit和 exit區別 exit會直接進入核心,不會關閉io流。程序基本控制函式還有 wait,fork,exec。atexit 程式正常退出時呼叫,如果因為signal退出則不能呼叫。功能 註冊函式可以完成一些清理工作,比如全域性log類,可以不設定析構...

unix環境高階程式設計 讀書筆記

檔案 unix支援在不同程序之間共享開啟的檔案。核心使用三種資料結構表示開啟的檔案 原子操作 一般而言,原子操作指的是由多步組成的操作。如果該操作原子的執行,要麼執行完所有步,要麼一步也不執行,不可能只執行所有步驟的乙個子集。2 注意 原子操作函式 pread,pwrite pread 相當於呼叫r...

Unix環境高階程式設計 讀書筆記一

unix 基礎知識 這一章主要是unix系統的概論以及一些概念的介紹,主要分為10個小節 1 登陸 2 檔案和目錄 3 輸入和輸出 4 程式和程序 5 ansi c 6 出錯處理 7 使用者標識 8 訊號 9 unix時間值 10 系統呼叫和庫函式 這個都比較簡單,就不再重複敘述了。在標頭檔案中定義...