Linux如何建立乙個程序

2021-07-26 18:55:03 字數 1902 閱讀 7700

每個程序都有以下屬性:

棧(stack)以幀為單位,當程式呼叫函式(假如該函式名為fun01)時,stack會向下增長一幀,這個幀會儲存該函式的引數、區域性變數以及返回位址,計算機將控制權交給fun01,fun01處於啟用狀態,這時 global data 和 該幀中的區域性變數共同構成了context也就是環境上下文。當函式又進一步呼叫另乙個函式的時候,乙個新的幀會繼續增加到棧的下方,控制權轉移到新的函式中。當啟用函式返回的時候,會從棧中彈出(pop,讀取並從棧中刪除)該幀,並根據幀中記錄的返回位址,將控制權交給返回位址所指向的指令。

程序元資料可以用來區分程序,了解程序狀態資訊

每乙個程序都有pid(程序id),ppid(程序的父程序id),pgid(程序組id)等,這些資訊描述了程序的各種資訊,但他們並不儲存在程序的記憶體空間中。核心會為每個程序在核心自己的空間中分配乙個變數(task_struct結構體)以儲存上述資訊。核心可以通過檢視自己空間中的各個程序的附加資訊就能知道程序的概況,而不用進入到程序自身的空間 (就好像我們可以通過門牌就可以知道房間的主人是誰一樣,而不用開啟房門)。每個程序的附加資訊中有位置專門用於儲存接收到的訊號。

一般情況下:

1  當乙個程式呼叫fork的時候,實際上就是將本程序的記憶體空間,包括text, global data, heap和stack,又複製出來乙個,構成乙個新的程序。

子程序的棧、資料以及棧段開始時是父程序記憶體相應各部分的完全拷貝,因此它們互不影響。從效能方面考慮,父 程序到子程序的資料拷貝並不是建立時就拷貝了的,而是採用了寫時拷貝(copy-on -write)技術來處理。

2  同時在核心中為改程序建立新的附加資訊 (比如新的pid,而ppid為原程序的pid)。

3  然後,程式呼叫exec的時候,程序清空自身記憶體空間的text, global data, heap和stack,並根據新的程式檔案重建text, global data, heap和stack (此時heap和stack大小都為0),並開始執行。

子程序在fork出來的時候,使用了寫時複製(cow,copy-on-write)方式獲得父程序的資料空間、 堆和棧副本,這其中也包括檔案描述符。剛剛fork成功時,父子程序中相同的檔案描述符指向系統檔案表中的同一項(這也意味著他們共享同一檔案偏移量)。這其中當然也包含父程序建立的socket。

接著,一般我們會呼叫exec執行另乙個程式,此時會用全新的程式替換子程序的正文,資料,堆和棧等。此時儲存檔案描述符的變數當然也不存在了,我們就無法關閉無用的檔案描述符了。所以通常我們會fork子程序後在子程序中直接執行close關掉無用的檔案描述符,然後再執行exec。

但是在複雜系統中,有時我們fork子程序時已經不知道開啟了多少個檔案描述符(包括socket控制代碼等),這此時進行逐一清理確實有很大難度。我們期望的是能在fork子程序前開啟某個檔案控制代碼時就指定好:「這個控制代碼我在fork子程序後執行exec時就關閉」。其實時有這樣的方法的:即所謂 的 close-on-exec  檔案描述標誌(file descriptors flag)

檔案描述符 file descriptors

檔案描述符是乙個標示,非負整數,類似於windows裡的控制代碼,

檔案描述標誌 file descriptors flag(目前就只有乙個close-on-exec):

它僅僅是乙個標誌,當程序fork乙個子程序的時候,在子程序中呼叫了exec函式時就用到了這個標誌。意義是執行exec前是否要關閉這個檔案描述符。要把檔案描述符標誌和檔案狀態標誌區分開來。

檔案狀態標誌 file status flag:

在系統核心維護的系統開啟檔案表中,每乙個系統檔案表項都有乙個關於write、read等的標誌

本文參考:

Linux如何建立乙個程序

每個程序都有以下屬性 棧 stack 以幀為單位,當程式呼叫函式 假如該函式名為fun01 時,stack會向下增長一幀,這個幀會儲存該函式的引數 區域性變數以及返回位址,計算機將控制權交給fun01,fun01處於啟用狀態,這時 global data 和 該幀中的區域性變數共同構成了contex...

在Linux下如何保證只建立乙個程序

在linux下,如果不加限制,同乙個程式,可以有多個執行例項,也稱之為程序 它們都有一樣的名字,執行著一樣的 段 不同的是,它們擁有不同的pid以及程序空間 有時候,希望同一時間只能建立乙個程序 下面這段示例 就加了這樣乙個限制 核心點 1.程序在啟動時,判斷 tmp my pid file是否存在...

程序的建立 如何發起乙個新專案

fork是乙個系統呼叫,根據系統呼叫的流程,最後在sys call table中找到相應的系統呼叫sys fork。根據syscall define0這個巨集的定義,下面 代表了sys fork syscall define0 fork sys fork會呼叫 do fork。long do for...