程序與程序環境
程序是執行中的程式,每個程序都執行在各自的虛擬位址空間中,某個程序的崩潰不會影響其它程序的執行。程序間的通訊(ipc)要通過系統核心(系統呼叫)來實現。
程序分類
在linux系統中,根據程序的特點,程序可分為3大類:互動程序、批處理程序和守護程序。
l 互動程序:由shell啟動的程序,可在前後臺執行,在執行過程中要求與使用者進行互動操作;
l 批處理程序:類似於windows中原來的批處理,是乙個程序序列,該程序負責按順序啟動其他程序;
l 守護程序:執行特定功能或者執行系統相關任務的後台程序。只是乙個特殊的程序,不是核心組成部分。許多守護程序在系統啟動時啟動,只到系統關閉時停止執行。而某些只在需要的時候才啟動,如ftp或apache服務,可在需要時啟動。(好像都是廢話)
虛擬記憶體
安裝linux時建立swap分割槽被用作記憶體的擴充套件,系統將暫時不會用到的資料寫到交換分割槽中,在需要時在都會記憶體,這種記憶體擴充套件機制被稱為虛擬記憶體。
linux中每個程序都執行在虛擬記憶體空間中。虛擬記憶體技術用於解決多程序同時執行時記憶體空間不足的問題,還提供了如下功能:
l 巨大定址空間:linux作業系統採用了虛擬記憶體管理技術,使得在32位系統上支援定址高達4gb的線性位址空間。使用者所看到的程序執行位址為虛擬位址,不是實體地址。4gb記憶體空間被分為使用者空間和核心空間。使用者程式在通常情況下只能訪問使用者空間,只有通過系統呼叫才能進入核心空間。與使用者空間的內容在程序切換會發生變化不同,核心空間是由核心進行對映的,因此不會隨著程序切換而發生變化。
vmstat命令可顯示虛擬記憶體使用情況。
程序記憶體
所有的程序執行在自己的虛擬位址空間中。而每個程序都有自己的記憶體位址。
每個程序執行在自己私有的記憶體空間中(即虛擬位址空間)。在32位系統中,4gb被分為使用者空間(03gb,16進製表示為0xc0000000),核心空間為3gb4gb。
對乙個程序而言,都會涉及3種不同的資料段,分別是**段、資料段和堆疊段。
l **段:儲存可執行檔案操作指令和程式定義的常量。為防執行時**被修改,只允許讀,不能進行修改。多程序能夠共享相同的**段,即當程式被多次執行時,執行的相同程式將共享**段。
l 資料段:位置緊接**段,分為初始化**段和未初始化**段(也被稱為bss段)。初始化資料段用於存放已經初始化的全域性變數和程式的靜態變數,而未初始化資料段用於儲存未初始化的全域性變數。
l 堆疊段:堆疊段中的堆用於存放程序中動態分配的記憶體位址。如c中的malloc函式,c++中的new函式分配的記憶體空間將在堆中分配。當使用free(如果記憶體是通過malloc函式分配)或delete函式釋放記憶體時,分配的記憶體將從堆中刪除。
棧用於儲存程式中建立的臨時變數,進行資料交換的記憶體區域。棧大小受作業系統限制,空間有限,而堆大小只是受限於虛擬記憶體空間,堆位置與資料段相鄰。
程序標識
linux系統使用程序id(pid)來標識程序。出了init程序(pid為1)外,每個程序都有乙個父程序。當父程序早於子程序結束時,子程序變為了「孤兒程序」,將被系統程序(init程序)收養。這時,init程序變為子程序的父程序。
每個程序在建立時候,系統會分配乙個程序id給該程序。當程序id達到系統最大值時(中有pid_max的定義,該常量表示系統能使用的最大pid數),系統將重新使用最小且當前未使用的pid號。
getpid函式返回當前程序的程序id,getppid函式返回當前程序的父程序id。
pid_t getpid(void);
pid_t getppid(void);
當root使用者建立新使用者時,會給每個使用者分配乙個使用者id(uid)。可在/etc/passwd檔案中查詢到使用者的uid資訊。linux系統每個程序都有兩個id:uid和euid。當使用者登入入系統時,系統會將uid和euid設定成/etc/passwd檔案中的uid。uid用於表示程序的建立者,只有程序的建立者和root使用者才有許可權對程序進行操作。euid用於確定程序在任何給定的時刻,對資源和檔案具有訪問許可權。通過使uid和euid不同,可使某個程式具有超越程式執行者的許可權。當設定了euid,無論哪個使用者執行該程序,程式將擁有檔案擁有者的許可權。
修改euid:chmod u+s filename;
修改egid:chmod g+s filename;
wait函式
為同步父子程序,父程序等待子程序結束,需要用到wait函式。如下為wait函式工作流程示意圖:
Linux程序環境
linux下c程式都是main開始的,main函式的原型是 int main int argc,char argv 其中argc是命令列引數的數目,argc是指向引數的各個指標所構成的陣列。c程式中有3個函式用於正常終止乙個程序,exit和 exit立即進入核心,exit則做一些清理工作後後進入核心...
(3 7)程序與執行緒 程序環境
2.命令列引數 3.環境變數表 4.如何訪問環境變數表?5.設定環境變數 標頭檔案unistd.h extern char environ 標頭檔案 stdlib.h char getenv const char name 指定環境變數名稱,返回環境變數字串指標,若未找到則返回空指標 putenv ...
linux程序(1) 程序執行的環境
標籤 空格分隔 linux 以下內容來自 unix環境高階程式設計 讀書筆記 首先想想下面幾個問題能不能解答 程序是程式執行的基本,程序即為程式執行的活動體。下面是程序在系統上執行的一些環境。int main int argc,char argv 當執行c程式的時候,在呼叫main函式之前會呼叫乙個...