linux 程序相關簡介

2021-05-24 03:21:40 字數 4877 閱讀 6252

簡單的說,程序是處於執行狀態的程式,乙個執行著的程式可能有多個程序。

程序一般分為互動程序、批處理程序和守護程序三類。守護程序總是活躍的,一般是後台執行,守護程序一般是由系統在開機時通過指令碼自動啟用啟動或超級管理使用者root來啟動。

程序的屬性

程序標誌符:程序id,核心分配,該標誌符非負,範圍0~32767

父程序和父程序id(ppid)

啟動程序的使用者id(uid)和所歸屬的組(gid);

程序的有效使用者id和有效組id

程序的程序組id:乙個程序可以屬於某乙個程序組。

程序的會話id:每乙個程序都屬於惟一的會話。

程序狀態:狀態分為執行r、休眠s、殭屍z;

程序執行的優先順序;

程序所連線的終端名;

程序資源占用:比如占用資源大小(記憶體、cpu佔用量);

獲得linux程序屬性的函式

getpid(void) 獲取當前程序id

getppid(void) 獲取當前程序的父程序id

getpgrp(void) 獲取當前程序的程序組id

getpgid(pid_t pid) 獲取程序組id

getuid(void) 獲取當前程序的使用者id

geteuid(void) 獲取當前程序的有效使用者id

getgid(void) 獲取當前程序的使用者組id

getegid(void) 獲取當前程序的有效使用者組id

getsid(pid_t pid) 獲取當前程序的會話id

例子:相應的有設定程序屬性的函式

int setpgid(pid_t pid,pid_t pgid)

setpgid()將引數pid 指定程序所屬的組id設為引數pgid 指定的組識別

碼。如果引數pid 為0,則會用來設定目前程序的組id,如果引數pgid為0,則會以

目前程序的程序id來取代。

int setpgrp(void)

setpgrp()將目前程序所屬的組id設為目前程序的程序id。此函式相當於呼叫setpgid(0,0)。

pid_t setsid(void)

setsid函式,呼叫該函式的程序將作為新會話的領導者建立乙個新的會話,

會話和呼叫程序的程序組id,將被設定為呼叫程序的程序id,並返回該程序id

int setuid(uid_t uid) 設定程序的使用者id

int setreuid(uid_t ruid, uid_t euid) 將程序的實際使用者id設定為ruid,有效使用者id設定為euid

int seteuid(uid_t uid) 設定程序的有效使用者id為uid

int setgid(gid_t gid) 設定程序的組id

int setregid(gid_t rgid, gid_t egid) 將程序的實際組id設定為rgid,有效組id設定為egid

int setegid(gid_t gid) 設定程序的有效組id

其中的函式可參看usr/include/unistd.h中的內容。

程序狀態:執行狀態,等待狀態,暫停狀態,殭屍狀態,退出狀態。

執行狀態(running):程序正在執行,或處於就緒狀態

等待狀態(sleeping):等待某事件的發生或者等待某種資源

暫停狀態(stopped):程序收到某個訊號,暫時停止執行

殭屍狀態(zombie):表示程序結束但尚未消亡的狀態

程序優先順序:

linux系統為多程序同時執行,linux採用了時間片輪轉的程序排程方式。程序的優先順序定義了程序被

排程的優先順序,優先順序的數值越低,其優先順序就越高。

linux用nice系統呼叫來修改程序的優先順序,預設情況下,程序的優先順序為0,系統允許的優先順序的

範圍為:-20~20

int nice(int inc)

nice()用來改變程序的程序執行優先順序。引數inc數值越大則優先順序排在越後面,即表示程序執行會越慢。

只有超級使用者才能使用負的inc值,代表優先順序排在前面,程序執行會較快。

返回值  如果執行成功則返回0,否則返回-1,失敗原因存於errno中。

錯誤**  eperm 一般使用者企圖轉用負的引數inc值改變程序優先順序。

nice系統呼叫只能用於修改程序自身的優先順序。

setpriority(設定程式程序執行優先權)

定義函式  int setpriority(int which,int who, int prio);

函式說明  setpriority()可用來設定程序、程序組和使用者的程序執行優先權。引數which有三種數值,引數

who則依which值有不同定義

which             who 代表的意義

prio_process     who為程序id

prio_pgrp         who為程序的組id

prio_user         who為使用者id

引數prio介於-20 至20 之間。代表程序執行優先權,數值越低代表有較高的優先次序,執行會較頻繁。

此優先權預設是0,而只有超級使用者(root)允許降低此值。

返回值  執行成功則返回0,如果有錯誤發生返回值則為-1,錯誤原因存於errno。

esrch 引數which或who 可能有錯,而找不到符合的程序

einval 引數which值錯誤。

eperm 許可權不夠,無法完成設定

eacces 一般使用者無法降低優先權

int getpriority(int which,int who);

函式說明  getpriority()可用來取得程序、程序組和使用者的程序執行優先權。

引數  which有三種數值,引數who 則依which值有不同定義

which             who 代表的意義

prio_process     who 為程序id

prio_pgrp         who 為程序的組id

prio_user         who 為使用者id

此函式返回的數值介於-20 至20之間,代表程序執行優先權,數值越低代表有較高的優先次序,執行會較頻繁。

返回值  返回程序執行優先權,如有錯誤發生返回值則為-1 且錯誤原因存於errno。

附加說明  由於返回值有可能是-1,因此要同時檢查errno是否存有錯誤原因。最好在呼叫次函式前先清除errno變數。

錯誤**  esrch 引數which或who 可能有錯,而找不到符合的程序。einval 引數which 值錯誤。

建立程序

int fork( void );

返回值:

子程序中返回0,父程序中返回子程序id,出錯返回-1

函式說明:

乙個現有程序可以呼叫fork函式建立乙個新程序。由fork建立的新程序被稱為子程序(child process)。

fork函式被呼叫一次但返回兩次。兩次返回的唯一區別是子程序中返回0值而父程序中返回子程序id。

子程序是父程序的副本,它將獲得父程序資料空間、堆、棧等資源的副本。

注意,子程序持有的是上述儲存空間的「副本」,這意味著父子程序間不共享這些儲存空間,它們之間共享的儲存空間只有**段。

pid_t wait (int * status);

函式說明

wait()會暫時停止目前程序的執行,直到有訊號來到或子程序結束。如果在呼叫wait()時子程序已經結束,則wait()會立即返回子程序結束狀態值。

子程序的結束狀態值會由引數status 返回,而子程序的程序識別碼也會一快返回。如果不在意結束狀態值,則引數status 可以設成null。

子程序的結束狀態值請參考下面的waitpid()。

返回值   如果執行成功則返回子程序識別碼(pid),如果有錯誤發生則返回-1。失敗原因存於errno 中。

pid_t waitpid(pid_t pid,int * status,int options);

返回值如果執行成功則返回子程序識別碼(pid),如果有錯誤發生則返回-1。失敗原因存於errno 中。

函式說明

waitpid()會暫時停止目前程序的執行,直到有訊號來到或子程序結束。如果在呼叫 wait()時子程序已經結束,則wait()會立即返回子程序結束狀態值。

子程序的結束狀態值會由引數status 返回,而子程序的程序識別碼也會一快返回。如果不在意結束狀態值,則引數status 可以設成null。引數pid 為欲等待的子程序識別碼,其他數值意義如下:

pid<-1 等待程序組識別碼為pid 絕對值的任何子程序。

pid=-1 等待任何子程序,相當於wait()。

pid=0 等待程序組識別碼與目前程序相同的任何子程序。

pid>0 等待任何子程序識別碼為pid 的子程序。

引數option 可以為0 或下面的or 組合:

wnohang 如果沒有任何已經結束的子程序則馬上返回,不予以等待。

wuntraced 如果子程序進入暫停執**況則馬上返回,但結束狀態不予以理會。

子程序的結束狀態返回後存於status,底下有幾個巨集可判別結束情況:

wifexited(status)如果子程序正常結束則為非0值。

wexitstatus(status)取得子程序exit()返回的結束**,一般會先用wifexited 來判斷是否正常結束才能使用此巨集。

wifsignaled(status)如果子程序是因為訊號而結束則此巨集值為真。

wtermsig(status) 取得子程序因訊號而中止的訊號**,一般會先用wifsignaled 來判斷後才使用此巨集。

wifstopped(status) 如果子程序處於暫停執**況則此巨集值為真。一般只有使用wuntraced 時才會有此情況。

wstopsig(status) 取得引發子程序暫停的訊號**,一般會先用wifstopped 來判斷後才使用此巨集。

可參見http://linux.chinaitlab.com/c/804149.html

Linux程序簡介

在一台伺服器上面看到有如下這麼多類似的程序 2 root 20 0 0 0 0 s 0 0.0 0 00.00 kthreadd 3 root rt 0 0 0 0 s 0 0.0 0 00.00 migration 0 4 root 20 0 0 0 0 s 0 0.0 0 00.09 ksoft...

linux程序簡介

程序是linux重要的一部分,了解linux就必須要去了解程序.程序是linux資源封裝單位,資源指的占用的記憶體,檔案系統,訊號,執行緒是排程執行的單元.linux可以做到程序間的資源隔離.程序的描述就是資源的描述.pcb process control block 是作業系統用來描述程序的,li...

Linux程序相關

下圖為ps命令各種字尾作用 uptime 了解計算機從啟動到現在已經多少時間 ps aux 檢視系統中正在執行的所有的程序 ps命令後面使用一下選項表示不同的含義 a 所有使用者 u 以面向使用者的形式顯示,即顯示擁有每個程序的使用者 x 顯示每個程序 f 提供完整的列表 僅僅執行ps aux,在預...