1、程序控制塊pcb
我們知道,每個程序在核心中都有乙個程序控制塊(pcb)來維護程序相關的資訊,linux核心的程序控制塊是task_struct結構體。
/usr/src/linux-headers-3.16.0-30/include/linux/sched.**件中可以檢視struct task_struct 結構體定義。其內部成員有很多,我們重點掌握以下部分即可:
* 程序id。系統中每個程序有唯一的id,在c語言中用pid_t型別表示,其實就是乙個非負整數。
* 程序的狀態,有就緒、執行、掛起、停止等狀態。
* 程序切換時需要儲存和恢復的一些cpu暫存器。
* 描述虛擬位址空間的資訊。
* 描述控制終端的資訊。
* 當前工作目錄(current working directory)。
* umask掩碼。
* 檔案描述符表,包含很多指向file結構體的指標。
* 和訊號相關的資訊。
* 使用者id和組id。
* 會話(session)和程序組。
* 程序可以使用的資源上限(resource limit)。
2、程序控制的一些相關函式
1、fork函式用於建立乙個子程序。
pid_t fork
(void
); 失敗返回-
1;成功返回:① 父程序返回子程序的id
(非負) ②子程序返回 0
pid_t型別表示程序id,但為了表示-
1,它是有符號整型。(
0不是有效程序id,init最小,為1
) 返回值:不是fork函式能返回兩個值,而是fork後,fork函式變為兩個,父子需【各自】返回乙個。
2、getpid函式獲取當前程序id
pid_t getpid
(void);
3、getppid函式獲取當前程序的父程序id
pid_t getppid
(void);
4、區分乙個函式是「系統函式」還是「庫函式」依據:
1>、是否訪問核心資料結構
2>、是否訪問外部硬體資源
二者有任一 → 系統函式;
二者均無 → 庫函式
3、程序共享
父子程序之間在fork後。有哪些相同,那些相異之處呢?
剛fork之後:
父子相同處: 全域性變數、.data、.text、棧、堆、環境變數、使用者id、宿主目錄、程序工作目錄、訊號處理方 式...
父子不同處: 1.程序id 2.fork返回值 3.父程序id 4.程序執行時間 5.鬧鐘(定時器) 6.未決訊號集
似乎,子程序複製了父程序0-3g使用者空間內容,以及父程序的pcb,但pid不同。真的每fork乙個子程序都 要將父程序的0-3g位址空間完全拷貝乙份,然後在對映至物理記憶體嗎?
當然不是!父子程序間遵循讀時共享寫時複製的原則。這樣設計,無論子程序執行父程序的邏輯還是執行自己的邏輯都能節省記憶體開銷。
重點注意!躲避父子程序共享全域性變數的知識誤區!
【重點】:父子程序共享:1. 檔案描述符(開啟檔案的結構體) 2. mmap建立的對映區 (程序間通訊詳解)
特別的,fork之後父程序先執行還是子程序先執行不確定。取決於核心所使用的排程演算法。
4、例子
迴圈建立子程序
#include
#include
#include
intmain
(void
)else
if(pid ==0)
}sleep
(i);
if(i <5)
else
return0;
}
linux程序管理(2)
程序家族樹 在task struct資料結構中,我們可以通過parent和children等域,如獲得當前程序的父程序 struct task struct my parent current parent 而在linux系統中,如前面所述,是儲存在乙個雙向鍊錶中的,所以可以通過以下方法獲得前乙個程...
linux程序管理2
1.後台執行作業 root lly sleep 100 2 5611 root lly sleep 1000 3 5612 root lly ps ef grep sleep root 5608 5577013 32 pts 000 00 00 sleep 1000 root 5611 557701...
聊聊程序 2 程序的管理
程序的管理是運維的基本功之一,對如何玩轉shell十分關鍵 bashpid 都可以,他們的區別如下指令碼 echo bashpid cat 11656 31528 echo bashpid 11656 11656 echo while read line do echo line bashpid d...