標籤(空格分隔): 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在多個程序之間快速切換,所以看起是同時進行的。這是一種假象 並行 針對多個處理器,一台機器上有多個處理器,那麼程序就有可能同時執...