《APUE》第7章 程式環境-讀書筆記

QingLiXueShi發表於2015-01-10

一、main函式。

main函式的原型如下。argc是命令列引數的數目,argv是指向引數的各個指標所構成的陣列。

int main(int argc, char *argv[])

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

啟動例程使得main返回後立即呼叫exit函式。例如:

exit(main(argc, argv));

 

二、程式終止。

有8種方式使程式終止。

 

1、退出函式。

3個函式用於正常終止一個程式:_exit和_Exit立即進入核心,exit先執行一些清理工作然後返回核心。exit總是執行一個標準I/O庫的清理關閉操作:對於所有開啟流呼叫fclose函式。

main函式返回一個整型值與該值呼叫exit是等價的。

exit(0);
return (0);   //兩條語句等價

 

2、函式atexit。

一個程式可登記至多32個函式,這些函式由exit自動呼叫。稱這些函式為終止處理函式,並呼叫atexit函式來登記這些函式。exit呼叫這些函式的順序與它們登記時候的順序相反。同一函式如若登記多次,也會被呼叫多次。exit首先呼叫各終止處理程式,然後關閉(通過fclose)所有開啟流。

核心使用程式執行的唯一方式是呼叫一個exec函式。程式自願終止的唯一方式是顯示或隱式地(通過呼叫exit)呼叫_exit或_Exit。程式也可非自願地由一個訊號使其終止。

 

三、命令列引數。

當執行一個程式時,呼叫exec的程式可將命令列引數傳遞給該新程式。注意:argv[argc]是一個空指標。

 1 #include <stdio.h>
 2 
 3 int main(int argc, char *argv[])
 4 {
 5     int i;
 6     for (i = 0; argv[i] != NULL; i++)
 7     {
 8         printf("argv[%d]: %s\n", i, argv[i]);
 9     }
10 
11     return 0;
12 }

 

四、環境表。

每個程式都接收到一張環境表。與參數列一樣,環境表也是一個字元指標陣列,其中每個指標包含一個以null結束的C風格字串地址。全域性變數environ則包含了該指標陣列的地址。

稱environ為環境指標,指標陣列為環境表,其中各指標指向的字串為環境字串。通常用getenv和putenv函式來訪問特定的環境變數,而不是用environ,但如果要檢視整個環境,必須使用environ指標。

 

五、C程式的儲存空間佈局。

 

六、共享庫。

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

 

七、函式setjmp和longjmp。

在C中,goto語句是不能跨越函式的,執行這種型別跳轉功能的是函式setjmp和longjmp。這兩個函式對於處理髮生在很深層巢狀函式呼叫中的出錯情況是非常有用的。  

 

八、函式getrlimit和setrlimit。

每個程式都有一組資源限制,其中一些可以用getrlimit和setrlimit函式查詢和更改。程式的資源限制通常是在系統初始化時由0程式建立的,然後由後續程式繼承。每種實現都可以用自己的方法對資源限制做出調整。

相關文章