linux程序(1) 程序執行的環境

2021-07-15 01:55:13 字數 2934 閱讀 8685

標籤(空格分隔): linux

以下內容來自《unix環境高階程式設計》讀書筆記

首先想想下面幾個問題能不能解答:

程序是程式執行的基本,程序即為程式執行的活動體。下面是程序在系統上執行的一些環境。

int main(int argc, char *argv);
當執行c程式的時候,在呼叫main函式之前會呼叫乙個特殊的啟動例程。可執行程式檔案將次啟動例程(start routin)指定為程式的起始位址(這是有鏈結的過程設定的)。啟動例程會去核心中取命令列引數和環境變數值,然後對呼叫main函式之前進行一些環境的初始化。

對啟動例程感興趣的可以參考下面的鏈結看下:

how does linux execute my main()?

main函式和啟動例程

書上說的是有8種情況下程序終止:

5中正常終止:

3種異常終止:

#include 

void

exit(int status);

void _exit(int status);

#include

void _exit(int status);

前面兩種屬於iso c的,後面一種屬於posix

_exit = _exit 作用相同

exit與_exit的差別在於,_exit會直接返回核心,而exit會先進行一些清理操作。

c**的啟動例程可以是這樣的:

exit(main(int argc, char* argv))
1.1 exit

書上說因為什麼歷史原因,導致exit函式總是執行乙個標準io庫的清理操作:即對所有開啟的流呼叫fclose函式,這就造成輸出緩衝的資料都被沖洗(重新整理:寫到檔案中)

三個函式都有乙個status引數值,這是程序終止的狀態值。

還記得原來剛學習的時候有main函式如下寫法:

void main(void)
就相當於最後結束的時候只是return,沒有返回值,給exit的status就是空的。

return(0) = exit(0)

有一點指明的是,當main函式沒有返回值,那麼他的返回值是隨機的,未定義的。

main函式宣告為返回int的,這是posix和iso定義。

1.2 atexit

程序登記函式,iso的規定乙個程序可以登記最多32個函式,這些函式有exit自動呼叫,這些函式為終止處理函式.

#include 

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

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

引數是乙個函式位址。

exit呼叫這些函式的順序與登記順序相反(估計登記的時候是放在棧中的。)同乙個函式若登記多次,也會呼叫多次。

前面所說的這些都可以用下面這張圖來解釋清楚:c程式啟動和終止

注意,核心使程式執行的唯一方法是呼叫乙個exec函式來呼叫程式。程序自願終止的唯一方法是顯式的或者隱式的(通過呼叫exit)呼叫_exit或者_exit。程序也可以非自願的有乙個訊號使其終結。

呼叫exec執行乙個程式的程序可以將命令列引數傳遞給該新程式。

引數儲存在一張參數列中,類似於環境表,如下。

extren char **environ;
環境表的結構如下:

環境變數在linux等系統屬於必須知道的東西。

環境變數字串形式是key-value形式的。linux的環境變數設定和檢視的底層函式:

#include 

char *getenv(const

char *name)

//成功,返回name關聯的value指標;沒有找到的,返回null

int putenv(char *str)

//成功返回0 失敗返回非0

int setenv(const

char *name, const

char *value, int rewrite)

int unsetenv(const

char *name)

簡單的說下這幾個函式:

這是一種經典的儲存模型。

圖中顯示的是這些段的一種經典的安排。

棧頂和堆頂之間的未用的虛擬空間很大。

a.out中還包含了若干其他型別的段,如包含符號表的段,包含除錯資訊的段,以及動態共享庫鏈結表的段等(《程式設計師的自我修養》中講的很清楚)。但是這些部分並不會裝載到程序執行的程式映像中的。

圖中看出:

共享庫使得可執行檔案中不再需要包含公用的庫函式,而只需在所有程序都可引用的儲存區中儲存這種庫例程的乙個副本。這樣可以大大的減少每個執行檔案的長度。

共享庫的另外乙個優點是:新版本的庫替代老版本無需使用該庫的程式重新連線編輯(只要介面不變的話)。

儲存空間動態分配函式:

#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)

這些操作也是最容易出錯的,並且出錯之後很難查詢那種。

釋放乙個已經釋放的塊。

記憶體洩露。**的記憶體洩露很危險。

alloca函式時在棧中申請儲存空間的函式,有些情況下很有用的。

以上基本是程序執行環境。儲存,變數,**,位址。

linux 程序與程序環境

程序與程序環境 程序是執行中的程式,每個程序都執行在各自的虛擬位址空間中,某個程序的崩潰不會影響其它程序的執行。程序間的通訊 ipc 要通過系統核心 系統呼叫 來實現。程序分類 在linux系統中,根據程序的特點,程序可分為3大類 互動程序 批處理程序和守護程序。l 互動程序 由shell啟動的程序...

Linux程序環境

linux下c程式都是main開始的,main函式的原型是 int main int argc,char argv 其中argc是命令列引數的數目,argc是指向引數的各個指標所構成的陣列。c程式中有3個函式用於正常終止乙個程序,exit和 exit立即進入核心,exit則做一些清理工作後後進入核心...

Linux程序1 程序的概念

1 什麼是程序 乙個正在執行的程式就是乙個程序 2 併發 並行 非同步 同步 臨界區 併發 針對乙個處理器,看起來同時進行。乙個處理器在同一時刻只能執行乙個程式,但是cpu在多個程序之間快速切換,所以看起是同時進行的。這是一種假象 並行 針對多個處理器,一台機器上有多個處理器,那麼程序就有可能同時執...