第七章 程序環境

2021-06-19 00:04:40 字數 1580 閱讀 3934

1.main 函式

c程式總是從main函式開始執行的。main函式的原型是:

int main(int argc,char *argv);

其中,argc是命令列引數的數目,argv是指向引數的各個指標構成的陣列。

當核心執行c程式時(使用乙個exec函式),在呼叫main前先呼叫乙個特殊的啟動例程。可執行程式檔案將此啟動例程指定為程式的起始位址——這是由連線編輯器設定的,而連線編輯器則由c編譯器呼叫。啟動例程從核心取得命令列引數和環境變數值,然後為按上述方式呼叫main函式做好安排。

2.程序終止

有8種方式使進行終止(temination),其中5種為正常終止,它們是:

(1)從main返回。

(2)呼叫exit。

(3)呼叫_exit或_exit。

(4)最後乙個執行緒從其啟動例程返回。

(5)最後乙個執行緒呼叫pthread_exit。

異常終止有3種方式,它們是:

(6)呼叫abort。

(7)接到乙個訊號並終止。

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

當main函式自然返回(主函式結束或使用return返回)時,程序將自動呼叫exit函式進行掃尾工作。其中有三個函式可以正常終止乙個程式:exit,_exit或_exit。exit先行一些清理處理(包括呼叫執行各終止處理程式,關閉所有標準i/o流等),然後進入核心;_exit和_exit則立即進入核心。

atexit()函式用來註冊程式正常終止時要被呼叫的函式。在乙個程式中最多可以用atexit()註冊32個處理函式,這些處理函式的呼叫順序與其註冊的順序相反,也即最先註冊的最後呼叫,最後註冊的最先呼叫。

3.共享庫

共享庫使得可執行程式檔案中不再需要包含公用的庫例程,而只需在所有程序都可引用的儲存區中維護這種庫例程的乙個副本。程式第一次執行或者第一次呼叫某個庫函式時,用動態鏈結方法將程式與共享庫函式相鏈結。這減少了每個可執行檔案的長度,但增加了一些執行時間開銷。

4.儲存器分配

有三個用於儲存空間動態分配的函式:

(1)malloc。分配指定位元組數的儲存區。此儲存區中的初始值不確定。

(2)calloc。為指定數量具指定長度的物件分配儲存空間。該空間中的每一位都初始化為0。 

(3)realloc。更改以前分配區的長度。當增加長度時,可能需將以前分配區的內容移到另乙個足夠大的區域,以便在尾端提供增加的長度區,而新增區域內的初始值則不確定。

在c中,goto語句是不能跨越函式的,而執行這類跳轉功能的是函式setjmp和longjmp。這兩個函式對於處理發生在深層巢狀函式呼叫中的出錯情況是非常有用的。使用時先由setjmp函式指定乙個jmp_buf型別快取,儲存暫存器中的資料,當通過longjmp函式返回至setjmp函式呼叫處時,暫存器中的值被恢復為setjmp函式第一次呼叫時的值,而儲存器中的值保持不變。由於優化編譯會對變數儲存位置造成影響(儲存在儲存器中或暫存器中),因此優化編譯可能導致setjmp函式通過longjmp返回時暫存器所恢復的值發生變化。記住,setjmp函式呼叫一次(記錄暫存器中的資料)而返回多次(第一次通過setjmp函式返回0,其他時間通過longjmp函式返回,返回值為longjmp函式第二引數);longjmp函式不會返回(返回到了setjmp函式的呼叫處)。

第七章 程序間通訊

第七章 程序間通訊 1 程序間通訊簡介 多個程序之間相互通訊 交換資訊的方法 方法 1 本地程序通訊 共享記憶體 訊號量 管道 命名管道 訊息佇列 2 遠端通訊 套介面 全雙工管道 2 共享記憶體和訊號量 1 共享記憶體 通過兩個或多個程序共享同一塊記憶體區域實現程序間通訊 最底層的通訊機制,最快速...

第七章 程序排程 介紹

7.2 排程指標 t周轉時間 t完成時間 t到達時間 7.3 先進先出 fifo example 1 工作平均周轉時間為 10 20 30 3 20 example 2 工作平均周轉時間為 100 110 120 3 120 7.4 最短任務優先 sjf example 1 工作平均周轉時間為 10...

第七章 進度計畫

一 單項選擇題 1.快速跟進是指 採用並行執行任務,加速專案進展 用乙個任務取代另外的任務 如有可能,減少任務數量 減輕專案風險 試題解析 a 參 採用並行執行任務,加速專案進展 2.下面哪一項可以決定進度的靈活性?pert 總浮動adm 趕工 試題解析 b 參 總浮動 3.是專案衝突的主要原因,尤...