UNIX程序的環境

2021-06-23 07:51:57 字數 1598 閱讀 9557

在學習程序之前,先來了解下程序的執行環境。

main函式

程序總是從main函式開始執行的,我們程式設計時,程式執行也是從main函式執行的,它的原型如下:

int main(int argc, char *argv);

argc是命令列引數的數目,argv是指鎮陣列,即指向指標的指標,可以寫**測試一下:

#include

int main(int argc, char *argv)

{int i;

for(i=0; i(a)從main函式返回

(b)呼叫exit

(c)呼叫_exit

(2)異常終止

(a)呼叫abort

(b)由乙個訊號終止

在上面的正常終止中有exit和_exit,區別在於:_exit呼叫後立即進入核心;而exit則會先執行一些清除工作(包括呼叫執行各種終止處理程式,關閉所有標準i/o流等),然後在進入核心。它們定義如下:

#include

void exit(int status);

#include

void _exit(int status);

使用了不同的標頭檔案,因為exit是右ansi c說明的,而_exit是由posix.1說明的。

atexit函式

我們可以在程序中登記一些函式(最多32個),這些函式由exit呼叫。這樣的函式叫做終止處理程式(exit handler),有atexit函式來登記。這點看起來有點像類的析構函式。

#include

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

其引數是乙個函式位址。exit呼叫順序與登記順序相反,先登記後呼叫(像棧),同乙個函式可以被登記多次。

環境表

c程式由以下幾部分組成:

正文段:也叫**段,是cpu執行的機器指令。正文段一般可以共享的,且是唯讀的。

初始化資料段:也叫做資料段,包含程式中已經初始化的全域性變數和靜態變數。

非初始化資料段:也叫做bss段,包含未初始化的全域性變數和靜態變數,在程式執行之前有核心初始化為0。不在**中儲存器初始值,可以減小**的大小。

棧:自動儲存變數以及每次函式呼叫時所需儲存的資訊都放在此段中。每次函式呼叫時,其返回位址、以及暫存器中的變數都放在棧中。新被調的函式在棧上為其自動和臨時變數分配儲存空間。

堆:進行動態分配的變數。需要手動釋放。堆位於未初始化資料段的頂和棧底之間。

儲存器的分配:

可以參考這裡

setjmp和longjmp

在c語言中,可以使用goto語言(雖然不建議使用),但是goto語句不能跳躍函式。執行這個跳轉功能的函式時setjmp和longjmp。這兩個函式對於處理發生在很深的巢狀呼叫中的出錯情況非常好用。遞迴呼叫返回時只能返回到上一層函式,這兩個函式可以使其跳出遞迴呼叫。

Unix程序環境

1.快取 a.全快取 當填滿標準i o快取後才進行實際i o操作 b.行快取 當在輸入和輸出中遇到新行符時,標準i o庫執行i o操作 2.printf返回值表示成功輸入的字元個數,返回0表示沒有輸出任何字元。unix程序環境 1.int main int a rg c,char a rg v ar...

UNIX程序環境

當執行程式時,main函式時如何被呼叫的?c程式總是從main函式開始執行。當核心在啟動c程式時,在呼叫main之前先呼叫乙個特殊的啟動例程。可執行程式將 核心取得命令列引數和環境變數,然後為呼叫main函式做好安排。程序的終止 1 正常終止 a 從main返回 b 呼叫exit c 呼叫 exit...

Unix程序環境之3 程序環境列表

1 程序環境 簡介當乙個程序 proecss 呼叫另乙個程式 program 時,同時會傳遞這個程式執行的環境列表 environment list 程序環境列表是乙個字元指標陣列,每個字元指標是乙個以空字元 null terminated 結束的c 字串。字元指標陣列位址包含在全域性變數envir...