在執行乙個可執行檔案的過程就是乙個程序,首先我們要看乙個程序很重要的結構圖:
正文段:這是由cpu執行的機器指令部分,通常正文段是可共享的,所以即使是頻繁執行的程式在儲存器中也只有乙個副本,另外正文段常是唯讀的,防止程式由於意外而修改其指令;
初始化資料段:通常也成為資料段,它包含了程式中需明確的賦值的變數,例如: int i=10;讓變數以其初始值存放在初始化資料段中。
未初始化資料段:也稱bss段,在程式執行前,核心將此段的資料初始化為0或者空指標。例如: int ar[10];使此變數存放在未出世化的資料段中。
棧:自動變數以及每次函式呼叫所需儲存的資訊都放在該段中。
堆:通常在堆中進行動態記憶體分配。
每個程序都有乙個非負整數的唯一程序id,雖然程序id是唯一的,但可以復用,當乙個程序結束後它的id可以供其他程序用。 系統中有一些專用程序,id為0的程序通常是排程程序,常常被稱為交換程序,該程序是核心的一部分,它並不執行任何磁碟上的程式,因此被稱為系統程序。程序id為1通常是init程序,在自舉過程結束時由核心呼叫,該程序的程式檔案在unix的早期版本中是/etc/init,在較新的版本中是/sbin/init,此程序負責在自舉核心後啟動乙個unix系統,它是乙個普通的使用者程序,與交換程序不同它不是核心中的系統程序,但它以超級使用者特權執行,它還是孤兒程序的父程序。下面我們來看看程序的建立和使用的一些函式:
#include
.h>
pid_t getpid(); //檢視程序的id號
pid_t getppid(); //檢視父程序的id號
pid_t getuid() ;//檢視程序的實際使用者id號
pid_t geteuid(); //檢視程序的有效使用者id號
get_t getgid(); //檢視程序的實際組id號
get_t getegid(); //檢視程序的有效組
實際使用者實際組和有效使用者有效組有什麼區別呢?
實際使用者實際組就是你現在所在地和該地所屬區域;
有效使用者和有效組就是你出生地和出生地所屬區域。
#include
pid_t fork(void);
fork函式可以建立乙個新的程序,它的使用簡單用一句話概括就是:fork執行成功一次有兩個返回值,父程序返回子程序的id號,子程序返回0;執行失敗返回-1。下面我們來看看簡單的fork()函式實現:
#include
#include
#include
#include
#include
using
namespace
std;
int main()
else
return
0;}
執行結果:
fork在建立乙個子程序的時候,子程序會把父程序從fork函式開始以下幾乎所有的資源都要複製,所以fork是乙個開銷很大的系統呼叫。
fork 失敗的原因主要有兩個:(1)系統中已經有了太多的程序(通常意味著某個方面出了問題),(2)該實際使用者id的程序總數超出了系統限制。
fork有以下兩種用法:(1)乙個父程序希望複製自己,使父程序子程序同時執行不同的**。這在網路服務程序中是常見的——父程序等待客戶端的服務要求。當這種要求到達時,父程序呼叫fork,使子程序處理次請求。父程序則繼續等待下乙個服務請求。(2)乙個程序要執行不同的程式。
3、fork的兄弟vfork:
vfork函式的呼叫序列和返回值與fork相同,當兩者的語義不同。vfork函式和fork函式都是建立乙個子程序,但它並不是將父程序的位址空間完全複製給子程序,因為子程序會隨時呼叫exec或者exit,於是也就不會引用該位址空間。不過在子程序呼叫exec或exit之前它在父程序的空間中執行。
fork和vfork之間的另外乙個區別就是:vfork保證子程序先執行,在它呼叫exec或exit之後父程序才能被排程執行,當子程序呼叫這兩個函式中的任意乙個時,父程序會恢復執行。(如果在呼叫這兩個函式之前子程序依賴於父程序的進一步工作,則會造成死鎖。)
下面我們來簡單的看看vfork建立子程序過程和結果:
#include
#include
#include
using
namespace
std;
int main()
else
if(pid == 0)
else
執行結果如下:
子程序會繼承父程序的很多屬性,主要包括id、組id、當前工作目錄、根目錄、開啟的檔案、建立檔案時使用的遮蔽字、訊號遮蔽字、上下文環境、共享的儲存環段、資源限制等。子程序與父程序也有一些不同的屬性,如:子程序有自己唯一的id;fork的返回值不同;不同的父程序id,子程序的父程序id為建立它的程序id;子程序共享父程序開啟的檔案描述符,但父程序對檔案描述符的改變不會影響子程序中的檔案描述;子程序不繼承父程序設定的檔案鎖;子程序不繼承父程序設定的警告;子程序的未決訊號集被清空。
Linux程序控制 一
一 程序識別符號 include pid t getpid void 返回值 呼叫程序的程序id pid t getppid void 返回值 呼叫程序的父程序id uid t getuid void 返回值 呼叫程序的實際使用者id uid t geteuid void 返回值 呼叫程序的有效使用...
Linux 程序控制(一)
計算機作業系統對於併發性和並行性的概念給出的定義是 並行性是指兩個或多個事件在同一時刻發生 併發性是指兩個或多個事件在同一時間段內發生。erlang 之父 joe armstrong 用一張5歲小孩都能看懂的 釋了併發與並行的區別 併發是兩個佇列交替使用一台咖啡機,並行是兩個佇列同時使用兩台咖啡機,...
linux 程序控制
什麼是程序 每乙個程序在系統中都有唯一的id標示它,此id為程序標示符 程序標示符的型別 pit t,其實是乙個無符號整形 乙個程序標示符對應唯一的乙個程序,多個程序標示符可以對應同乙個程式 程序和程式的區別 程式 可執行的二進位制 檔案,這種檔案載入到記憶體中執行就得到了乙個程序 程序 同乙個程式...