第三章學習筆記(20191213蘭毅達)
第三章學習筆記
一、什麼是程序
在Linux系統中:觸發任何一個事件時,系統都會將它定義成為一個程序,並且給予這個程序一個ID,成為PID,同時依據啟動這個程序的使用者與相關屬性關係,給予這個PID一組有效的許可權設定 如何產生程序:執行一個程式或指令 程式放在實體磁碟當中,然後透過使用者的執行來觸發,觸發後會載入到記憶體中成為一個個體,那就是程序,為了作業系統可管理這個程序,因此程序有給予執行者的許可權、屬性引數,幷包括程式所需要的指令碼與資料或檔案資料等,最後在給予一個PID 關於子程序與父程序 在bash中再呼叫bash 注意:當父程序存在消滅子程序,父程序會主動再生成一支,要找出父程序並消滅 fork and exec程序呼叫流程 程序會有父程序以複製的方式產生一個一模一樣的子程序,然後被複製出來的子程序再以exec的方式來執行實際要進行的程式,最終成為了一個子程序的存在 常駐在記憶體中的程序通常是負責一些系統所提供的功能以服務使用者各項工作,這些常駐程式被稱為:服務(daemon) 一般daemon型別的程式都會加上d在檔名後頭 在單一bash介面下進行多個工作: 命令後加& 表示將命令放置於背景中執行
二、工作管理
工作管理(job control)當我們登入系統取得bash shell之後,在單一終端機介面下同時進行多個工作的行為管理 進行工作管理的行為中,其實每個工作都是當前bash的子程序,彼此之間是有相關性的,無法以job control 的方式由tty1的環境管理tty2的bash 離線管理問題 在工作管理中提到的背景指的是在終端機模式下可以避免Ctrl+C中斷的一個情景,若退出終端機工作不會繼續 有兩種離線執行的辦法,at和nohup 例子:nohup ./sleep500.sh & 將這個指令碼執行在終端機背景中
三、程序管理
ps:觀察某個時刻程序運作狀態 只查閱自己bash程序的:ps -l F:代表這個程序旗標(process flags)說明這個程序的總結許可權 4表示此程序的許可權為root 1表示此子程序僅進行復制(fork)而沒有實際執行(exce) S:代表這個程序的狀態 UID、PID、PPID:擁有者ID、程序ID、父程序ID C:CPU使用率,單位為百分比 PRI、NI:priority、nice的縮寫,代表被CPU執行的優先順序,數值越小代表該程序越快被CPU執行 ADDR、SZ、WCHAN:都與記憶體有關,ADDR是kernel function,指出該程序在記憶體的哪個部分,如果是個running的程序,一般顯示 - ;SZ表示此程序用掉了多少記憶體,WCHAN表示目前程序是否在運作中, - 表示正在運作 TTY:登入者的終端機位置,若為遠端登入則使用動態終端介面(pts/n); TIME:使用掉的COU時間 CMD:造成此程序觸發的指令 查閱所有系統運作的程序:ps aux ps -lA 也比較常用 ps axjf列出類似程序樹的程序顯示,也可以使用pstree 殭屍程序 該程序應該已經執行完畢,或者因故應該要終止了,但是該程序的父程序卻無法完整的將該程序結束掉,而造成那個程序一直存在記憶體當中 當CMD後面還接上<defunct>代表該程序是殭屍程序 top:動態觀察程序的變化 將top的輸出重定向到檔案:top -b -n 2 > /tmp/top.txt pstree:程序樹 -A,-U是用ASCII碼或者Unicode -u,-p輸出UID和PID
系統資源的觀察
free:觀察記憶體使用情況
uname:查閱系統與核心相關資訊
uptime:觀察系統啟動時間與工作負載
netstat:追蹤網路和插槽檔案
netstat -tulnp 找出目前系統上已在監聽的網路聯機及其PID
dmesg:分析核心產生的訊息
vmstat:偵測系統資源變化
四、程序管理的系統呼叫
1、fork()
int pid = fork()
fork()建立子程序並返回子程序的pid。
2、程序終止
(1)正常終止:當核心中的某個程序終止時,他會將_exit(value)系統呼叫中的值記錄為程序PROC結構體中的退出狀態。並通知他的二父程序並使該程序成為殭屍程序。父程序課通過系統呼叫找到殭屍子程序,獲得其pid和退出狀態
pid=wait(int *status)
(2)異常終止:當某程序遇到異常時,他會陷入作業系統核心。核心的異常處理程式將陷阱錯位型別轉換為一個幻數,稱為訊號,將訊號傳遞給程序,時程序終止。使用者可以使用命令
kill -s signal_numeber pid
向通過pid識別的目標傳送訊號。
3、等待子程序終止
在任何時候,一個程序都可以使用
int pid = wait(int *status);
系統呼叫,等待殭屍子程序。
4、環境變數
各環境變數定義為:
關鍵字=字串
重要環境變數:
SHELL=/bin/bash
TERM=xterm
USER=kcw
PATH=/usr/1oca1/bin:/usr/bin:/bin:/usr/local/games:/usr/games:./
HOME= / home /kcw
SHELL:指定將解釋任何使用者命令的sh。
TERM:指定執行sh時要模擬的終端型別。
USER:當前登入使用者。
PATH:系統在查詢命令時將檢查的目錄列表。
HOME:使用者的主目錄。在 Linux 中,所有使用者主目錄都在/home中。
在sh會話中,可以將環境變數設定為新的(字串)值,如:
HOME= / home / newhome
可通過EXPORT命令傳遞給後代sh,如
expoert HOME
5、管道
管道時用於程序交換資料的單向程序件通訊通道。管道有一個讀取端和一個寫入端。
1、管道命令處理
在Unix/Linux中,命令列
cmd1 | cmd2
sh將通過一個程序執行cmd1,並通過另一個程序執行cmd2,他們通過一個管道連線在一起,因此cmd1的輸出變為cmd2的輸入
2、命令管道
命令管道又叫FIFO
(1)在sh中,通過mknod命令建立一個命令管道:
mknod mypipe p
(2)或在c語言中發出mknod()系統呼叫
int r = mknod("mypipe",s_IFIFP,0);
(3)程序可像訪問普通檔案一樣發個文命名管道。
六、實踐與程式碼
ps -ef|grep root
fork函式演示
#include <unistd.h>
#include <stdio.h>
int main ()
{
pid_t fpid; //fpid表示fork函式返回的值
int count=0;
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d\n",getpid());
printf("我是爹的兒子\n");//對某些人來說中文看著更直白。
count++;
}
else {
printf("i am the parent process, my process id is %d\n",getpid());
printf("我是孩子他爹\n");
count++;
}
printf("統計結果是: %d\n",count);
return 0;
}