天天看點

第二章 程序一、程序辨別二、程序的使用者ID與組ID(程序的運作身份)三、程序狀态四、Linux下的程序結構五、Linux下的程序管理

一、程序辨別

OS會為每個程序配置設定一個唯一的整型ID,做為程序的辨別号(pid)。程序除了自身的ID外,還有父程序ID(ppid),所有程序的祖先程序是同一個程序,它叫做init程序,ID為1,init程序是核心自舉後的一個啟動的程序。init程序負責引導系統、啟動守護(背景)程序并且運作必要的程式。

雖然程序ID是唯一的,但是程序ID是可複用的。當一個程序終止後,其程序ID就成為複用的候選者。

系統中有一些專用程序,但具體細節随實作而不同。ID為0的程序通常是排程程序,常常被稱為交換程序。該程序是核心的一部分,它并不執行任何磁盤上的程式,是以也被稱為系統程序。

程序的辨別号(pid)和父程序ID(ppid)可以分别通過函數getpid()和getppid()獲得(傳回值都是整型的)。

二、程序的使用者ID與組ID(程序的運作身份)

程序在運作過程中,必須具有一類似于使用者的身份,以便進行程序的權限控制,預設情況下,哪個登入使用者運作程式,該程式程序就具有該使用者的身份。例如,假設目前登入使用者為gotter,他運作了ls程式,則ls在運作過程中就具有gotter的身份,該ls程序的使用者ID群組ID分别為gotter和gotter所屬的組。這類型的ID叫做程序的真實使用者ID和真實組ID。真實使用者ID和真實組ID可以通過函數getuid()和getgid()獲得(傳回值都是整型的)。

與真實ID對應,程序還具有有效使用者ID和有效組ID的屬性,核心對程序的通路權限檢查時,它檢查的是程序的有效使用者ID和有效組ID,而不是真實使用者ID和真實組ID。預設情況下(系統預設情況),使用者的(有效使用者ID和有效組ID)與(真實使用者ID和真實組ID)是相同的。有效使用者id和有效組id通過函數geteuid()和getegid()獲得(傳回值都是整型的)。

#include <unistd.h>

pid_t getpid()      //傳回值:調用程序的程序ID

pid_t getppid()     //傳回值:調用程序的父程序ID

uid_t getuid()      //傳回值:調用程序的實際使用者ID

uid_t geteuid()     //傳回值:調用程序的有效使用者ID

gid_t getgid()      //傳回值:調用程序的實際組ID

gid_t getegid()     //傳回值:調用程序的有效組ID
           
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
	printf("pid:%d   ppid:%d\n",getpid(),getppid());
	printf("uid:%d   euid:%d\n",getuid(),geteuid());
	printf("gid:%d   egid:%d\n",getgid(),getegid());
	return 0;
}
           
第二章 程式一、程式辨別二、程式的使用者ID與組ID(程式的運作身份)三、程式狀态四、Linux下的程式結構五、Linux下的程式管理

PS:用ps -elf可以檢視現有程序

ps -elf | grep pidname 檢視程序pid

kill -9 pidname 殺掉程序

第二章 程式一、程式辨別二、程式的使用者ID與組ID(程式的運作身份)三、程式狀态四、Linux下的程式結構五、Linux下的程式管理

将編譯後的可執行檔案的權限改為“s”(s的含義:将可執行程式的權限上升到root,比如密碼的修改。在賦予s權限的時候,必須確定程式有x權限,是可執行程式,否則s權限不能生效,顯示為大寫的S)

第二章 程式一、程式辨別二、程式的使用者ID與組ID(程式的運作身份)三、程式狀态四、Linux下的程式結構五、Linux下的程式管理

三、程序狀态

程序是程式的執行過程,根據它的生命周期可以劃分成3種狀态: 1、執行态:該程序正在運作,即程序正在占用CPU。 2、就緒态:程序已經具備執行的一切條件,正在等待配置設定CPU的處理時間片 3、等待态:程序不能使用CPU,若等待事件未發生(等待的資源配置設定到)則可将其喚醒。

第二章 程式一、程式辨別二、程式的使用者ID與組ID(程式的運作身份)三、程式狀态四、Linux下的程式結構五、Linux下的程式管理

排程政策:(具體請參考作業系統) OTHER :普通排程政策 實時排程政策: FIFO:先進先出 RR:時間片輪轉

四、Linux下的程序結構

Linux系統是一個多程序的系統,他的程序之間具有并行性、互不幹擾等特點。也就是說,程序之間是分離的任務,擁有各自的權利和責任。其中,每個程序都運作在各自獨立的虛拟位址空間是以,即使一個程序發生了異常,它也不會影響到系統的其他程序。 Linux中的程序包含3個段,分别為“資料段”、“代碼段”和“堆棧段”。 1、“資料段”放全局變量、常數以及動态資料配置設定的資料空間。資料段分成普通資料段(包括可讀可寫/隻讀資料段,存放靜态初始化的全局變量或常量)、BSS資料段(存放未初始化的全局變量)以及堆(存放動态配置設定的資料)。 2、“代碼段”存放的是程式代碼的資料(不可改寫)。 3、“堆棧段”存放的是子程式的傳回位址、子程式的參數以及程式的局部變量等。(每執行一個函數就配置設定一個棧,函數結束,棧就消失)

第二章 程式一、程式辨別二、程式的使用者ID與組ID(程式的運作身份)三、程式狀态四、Linux下的程式結構五、Linux下的程式管理

系統運作的核心線程都在核心程序(硬體),平時寫的程式都運作在使用者态,使用者要想進入核心态必須通過系統調用接口。

五、Linux下的程序管理

第二章 程式一、程式辨別二、程式的使用者ID與組ID(程式的運作身份)三、程式狀态四、Linux下的程式結構五、Linux下的程式管理

備注: 程序process是os的最小單元,os會為每個程序配置設定大小為4G的虛拟記憶體空間,其中1G給核心空間,3G給使用者空間(代碼區,資料區,堆棧區) ps檢視活動程序,ps -aux檢視所有的程序  ps -aux|grep aa 查找指定(aa)程序  ps -ef可以顯示父子程序關系 top顯示前20條程序,動态的改變 ps -aux看%cpu(cpu使用量)%mem(記憶體使用量)  stat(狀态)(S睡眠 T暫停(和S一起在等待隊列裡) R運作 Z僵屍) 程序進入死循環時,按Ctrl+z可以把程式暫停(向程序發送一個SIGSTOP暫停信号,kill -l檢視信号),再執行[bg 作業ID]可以将該程序帶入背景。利用jobs可以檢視背景任務,fg 1把背景任務帶到前台,這裡的1辨別作業ID。

指令:

第二章 程式一、程式辨別二、程式的使用者ID與組ID(程式的運作身份)三、程式狀态四、Linux下的程式結構五、Linux下的程式管理

對應的狀态

第二章 程式一、程式辨別二、程式的使用者ID與組ID(程式的運作身份)三、程式狀态四、Linux下的程式結構五、Linux下的程式管理