程序與程式
程式:儲存在磁碟上的檔案,包含可執行指令和資料的靜態實體
程序:執行中的程式(乙個程式可以執行多次,載入出多個程序)
程序就是處於活動狀態的電腦程式
程序的分類
互動程序:有輸入有輸出。使用者可以根據自己的情況輸入資料,得到想要的結果(一般程序)
批處理程序:由指令碼載入執行的程式(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...