Linux系統基礎 程序相關操作

2021-09-26 02:04:32 字數 4450 閱讀 5480

程序與程式

程式:儲存在磁碟上的檔案,包含可執行指令和資料的靜態實體

程序:執行中的程式(乙個程式可以執行多次,載入出多個程序)

程序就是處於活動狀態的電腦程式

程序的分類

互動程序:有輸入有輸出。使用者可以根據自己的情況輸入資料,得到想要的結果(一般程序)

批處理程序:由指令碼載入執行的程式(linux下的shell,windows下的bat)

守護程序:總是活躍的、後台執行,一般由系統開機時載入執行,或root使用者手動載入執行

察看程序:

簡單方式:ps,顯示當前使用者有終端控制權的程序資訊

列表形式:aux,一列表形式顯示詳細資訊

a所有使用者的終端控制程序

u詳細方式顯示

x所有無終端控制的程序

程序的詳細資訊列表

user:程序的使用者名稱

pid:程序id

%cpu 程序的cpu使用率

%mem 記憶體的使用率

vsz 虛擬記憶體占用的位元組數

rss 占用物理記憶體的大小

tty 終端的次裝置號,如果無終端控制權顯示?

stat 程序的狀態

o 就緒態,等待被系統呼叫

r 執行態,linux系統下沒有就緒態,也用r表示

s 休眠態,可以被系統中斷,也就是被中斷訊號喚醒進入執行態

t 暫停態,是被sifstop訊號暫停的,當收到sigcont訊號才能再轉入執行

z 殭屍態,已經結束停止執行,但父程序還沒有**

< 表示高優先順序程序

n 表示低優先順序

l 多執行緒

+ 在前台程序組中的程序

s 會話首程序

start time 程序的開始時間

command 程序的程式名

父程序與子程序 孤兒程序與殭屍程序

乙個程序a可以建立另乙個程序b 建立者叫父程序,被建立者叫子程序,

父程序啟動子程序,在作業系統的呼叫下父程序同時執行(同步)

如果子程序先於父程序結束,會向父程序傳送sigchid訊號,父程序收到訊號後就應該去**子程序的相關資源

但在預設情況下,父程序忽略該訊號。當子程序結束後,父程序沒有**子程序的資源,子程序就變成了殭屍程序

如果父程序先於子程序結束,子程序就變成了孤兒程序,同時被孤兒院收養(init),然後就變成了init的子程序

作業系統會為每個程序分配唯一的標誌符,採用無符號整數表示,即程序id

程序id在任何時候都是唯一的,但是可以重用,當一程序結束,新建立的程序才可以使用它的程序id(延時重用)

pid_t getpid(void);

功能:獲取程序id

pid_t getppid(void);

功能:獲取父程序id

uid_t getuid(void);

功能:獲取當前程序的使用者id

gid_t getgid(void);

功能:獲取當前的組id

getpgid

獲取pid程序組的程序組id

setpgid

設定pid_t fork(void)

功能:建立乙個新程序

返回值:一次呼叫,兩次返回 失敗返回-1(當程序數超出系統的限制的時候)

兩次返回分別是子程序id和0,父程序會拿到子程序id,子程序返回0,藉此可以分別出父子程序

通過fork建立子程序就是父程序的副本(拷貝)

子程序會獲取父程序的資料段、bss段、堆、棧、io流(共享檔案指標和檔案描述符、緩衝區的拷貝

,與父程序共享**段

子程序會繼承父程序的訊號處理方式

fork函式呼叫後,父子程序各自執行,誰先返回不一定。但可以使用一些特殊手法來確保誰先執行

殭屍程序和孤兒程序的實現

子程序和父程序是併發執行的,一般用於多工

練習一:實現乙個程式來驗證,子程序確實拷貝了父程序的資料段、bss段、堆、棧、io流 共享檔案指標和檔案描述符

從main函式中return。

注意:兩個函式的功能是一樣的

#include

void _exit(int status);

#include

void _exit(int status);//呼叫系統的_exit為了相容性

功能:呼叫的程序會結束,沒有返回值

status:這個引數會被父程序獲取到(低八位,乙個位元組)

1)程序結束前會關閉所有處於開啟狀態的檔案描述符

2)把所有的子程序託付給init(孤兒院)

3)向它的父程序傳送sigchld訊號

注意:exit函式也會執行以上操作,因此它底層呼叫了 _exit / _exit

4)程序的最後乙個執行緒執行了最後一條語句。

5)程序的最後乙個執行緒掉用了pthread_exit函式

呼叫了abort函式,該函式產生乙個 sigabrt 訊號

程序接受到一些訊號,無捕獲處理,或無法捕獲處理

程序的最後乙個執行緒接受到取消請求,並對請求做出響應(類似於執行緒收到結束訊號)

#include

#include

pid_t wait(int *status);

功能:等待所有子程序結束,並獲取到最後的狀態碼,只要有乙個程序結束就立即返回

應該是父程序接受到子程序傳送來的sigchld訊號時,呼叫wait函式**子程序的資源並獲取結束狀態

如果所有子程序都在執行,則wait阻塞,

如果有殭屍程序,wait也會立即返回,**資源獲取結束狀態碼

如果沒有子程序則返回失敗-1

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

功能:等待指定的程序結束,並獲取到最終的狀態碼

wnohang:非阻塞模式 如果沒有子程序則立即退出

wuntraced:如果子程序屬於暫停狀態,則返回他的狀態

wcontinued:如果子程序從暫停轉為繼續,則返回他的狀態

0:阻塞狀態

pid的值

=-1 等待任意子程序結束,此時與wait等價

>0 等待程序號為pid的程序結束,此時只等待乙個程序結束

=0 等待同組的任一子程序結束,此時等待的是整個程序組

<-1 等待的是程序組id是pid絕對值中的任一子程序結束,

wait函式只能孤獨的等待子程序結束,而waitpid可以有更多的選擇

waitpid不僅僅可以等待子程序,也可以等待同組程序,

可以阻塞也可以不阻塞

可以監控子程序的暫停或繼續狀況

pid_t vfork(void);

功能:與fork功能基本一致

區別:通過vfork建立的程序不複製父程序的位址(空間資料段、bss段、堆、棧、io流、共享檔案指標和檔案描述符、緩衝區的拷貝)

必須通過excl系列函式載入自己的可執行程式。

注意:當執行vfork時,先返回的是子程序,此時他占用父程序的位址空間,當子程序成功建立後(通過excl載入可執行程式),父程序才返回

功能:載入子程序的可執行檔案。

int execl(const char *path, const char *arg, …);

path:可執行檔案的路徑

arg:第乙個main函式的引數,最後乙個必須是null結尾

int execlp(const char *file, const char *arg, …);

file:可執行檔案的名字,可以從環境變數表中查詢

arg:第乙個main函式的引數,最後乙個必須是null結尾

int execle(const char *path, const char *arg,

…, char * const envp);

envp:父程序的環境變數表傳遞給子程序

int execv(const char *path, char *const ar**);

int execvp(const char *file, char *const ar**);

int execvpe(const char *file, char *const ar**,

char *const envp);

int system(const char *command);

功能:執行系統命令,也可以載入可執行程式。

相當於建立了乙個子程序,但子程序不結束,該函式不返回,父子程序不會同時執行

該函式的實現呼叫了:vfork、exec、wait

程序組:是由乙個或多個程序的集合,每乙個程序除了乙個程序id還有乙個組id,

程序組中的程序歸屬同乙個作業控制

同意程序組的程序,會統一接收到終端的訊號,由相當於加入gpid

每乙個程序都有乙個程序組組長,組長的程序id就是組id

pid_t getpgid(pid_t pid);

功能:獲取pid程序的程序組id

int setpgid(pid_t pid, pid_t pgid);

設定pid程序的程序組id,相當於加入了pgid程序組,pgid就是組長

Linux基礎 程序相關

top命令,使用q可以退出 pgrep l 檢視程序pid ps ax 檢視程序資訊 有十幾種控制程序的方法,下面是一些常用的方法 kill stop pid 傳送sigstop 17,19,23 停止乙個程序,而並不消滅這個程序。kill cont pid 傳送sigcont 19,18,25 重...

Linux相關基礎操作

登入 root host mysql u root p 退出 mysql exit 1 顯示伺服器上當前存在什麼資料庫 show databases 2 建立名稱為rewin的資料庫 create database rewin 3 刪除名稱為rewin的資料庫 drop database rewin...

LINUX系統程序相關的API

在linux系統下可以用ps指令來檢視系統的程序 在實際工作中經常使用 ps aux gep 程式名,就可以檢視目標程式的程序。也可以用top指令檢視,相當於windows系統下的任務管理器。每個程序都有自己的程序 用getpid函式可以獲取當前經常的程序號 include include incl...