實驗五:Linux進程管理
一、實驗目的
- 熟練使用進程操作函數編寫程序。
- 熟練掌握
exec
函數族的用法。 - 掌握同步進程的方法。
二、實驗環境
Ubantu或Centos
三、實驗內容
1.創建進程
- 創建一個進程
- 利用循環結構創建多個進程
2.exec函數族
使用execv()
函數調用用戶程序,更改子進程的功能。
3.進程同步
使用循環創建多個子進程,使用wait()函數完成所有子進程的回收工作。
4.進程管理命令
熟練使用進程管理命令管理與查看進程信息。
需練習的進程管理命令有:ps
、top
、pstree
、pgrep
、nice
、bg
、fg
、jobs
、kill
。
四、實驗步驟
1. 創建進程——fork()
預備知識
fork()
函數用於創建進程,該函數的原型如下:
pid_t fork(void);
函數調用成功後,
- 父進程中的
fork()
函數返回子進程的pid
, - 子進程中的
fork()
函數返回0
;
函數調用失敗則返回-1
。
fork()函數的使用
2. exec函數族
預備知識
execl()
execl()
函數的原型如下:
int execl(const char *path, const char *arg, ...);
execlp()
execlp()
函數的原型如下:
int execlp(const char *file, const char *arg, ...);
execle()
execle()
函數的原型如下:
int execle(const char *path, const char *arg, ..., char * const envp[]);
execv()
execv()
函數的原型如下:
int execv(const char *path, char *const argv[]);
execvp()
execvp()
函數的原型如下:
int execvp(const char *file, char *const argv[]);
execve()
execve()
函數的原型如下:
int execve(const char *path, char *const argv[], char *const envp[]);
exec函數族的使用
3. 進程同步
預備知識
進程同步中用到的函數有wait()
和waitpid()
。
wait()
函數
wait()
函數的原型如下:
pid_t wait(int *status);
wait()
的功能是阻塞等待子進程終止,回收子進程資源,調用wait()
函數的進程會被掛起,進入阻塞狀態,直到它的某個子進程變爲殭屍態。
wait()
函數中的參數status
可以爲NULL
,當其不爲NULL
時,參數status
將用於獲取回收子進程的退出狀態。
退出狀態存放在參數status
的低8位中,可通過Linux
系統中提供的一組宏函數來獲取,其中最常用的宏函數有WIFEXITED()
和WEXITSTATUS()
,它們的參數與wait()
函數相同,都是一個整型的status
。
宏函數的功能分別如下:
WIFEXITED(status)
:用於判斷子程序是否正常退出,若是,返回非零值;否則返回0。WEXITSTATUS(status)
:WEXITSTATUS()
通常與WIFEXITED()
結合使用,若WIFEXITED
返回非零值,即正常退出時,使用該宏可以提取出子進程的返回值。
waitpid()函數
waitpid()
函數的原型如下:
pid_t waitpid(pid_t pid,int *status,int options);
waitpid()
也可回收子進程資源,但可通過傳遞不同參數,設置waitpid()
函數回收子進程的方式,以及回收子進程的範圍。
-
參數
pid
一般是進程的pid
,但也會有其它取值。
參數pid
的取值及其意義分別如下:pid>0
時,只等待pid
與該參數相同的子進程;pid=-1
時,waitpid()
函數與wait()
函數作用相同,將阻塞等待並回收一個子進程;pid=0
時,等待同一個進程組的所有子進程;pid<-1
時,等待指定進程組中的任何子進程,進程組的id
等於pid
的絕對值。
-
參數
options
提供控制waitpid()
的選項,該選項是一個常量,或由|
連接的兩個常量。該選項支持的選項如下:WNOHANG
,即使子進程沒有終止,waitpid()
也會立即返回;WUNTRACED
,如果子進程暫停執行,則waitpid()
立刻返回;- 若不想使用該參數,可以將其值設置爲
0
。
-
waitpid()
函數的返回值會出現3種情況:- 正常返回時,
waitpid()
返回捕捉到的子進程的pid
; - 若
options
的值爲WNOHANG
,但調用waitpid()
時發現沒有已退出的子進程可收集,則返回0
; - 若調用過程出錯,返回
-1
。errno
會被設置成相應的值以指示錯誤位置。
- 正常返回時,
進程同步的實現
4. 進程管理命令
ps命令
BSD
風格的常用選項:a/u/x/e/f
SysV
風格的常用選項:-a/-e/-f/-o/-l
top命令
top
命令常用熱鍵:l/t/m/M/P/T/r/i/k
l/t/m
——控制top前幾行信息的顯示top
——在終端啓動top命令M
——根據常駐內存集的大小爲進程排序P
——根據%CPU爲進程排序T
——根據TIME+爲進程排序i
——忽略閒置和僵死的進程k
——終止一個進程
pstree命令
pstree
命令常用選項:-a/-c/-h/-u/-n
pstree –h //列出樹狀圖
pgrep命令
pgrep
命令常用選項:-o/-n/-p/-t/-u
pgrep –o itcast //根據用戶名itcast查找進程,僅顯示pid最小的進程
pgrep –n root //根據用戶名root查找進程,僅顯示pid最大的進程
nice命令
nice –n 5 bash //更改bash 的優先級
nice –n 6 top //啓動top進程後,更改top進程優先級、
bg / fg / jobs
top & //在後臺啓動top命令
top //在前臺啓動top命令
Ctrl+Z //將top送往後臺
jobs //查看當前終端後臺運行的進程
fg 1 //將作業編號爲1的top進程調回前臺
kill命令
ps //查看終端運行的進程
kill -9 5825 //殺死進程pid爲5825的進程
五、實驗總結
代碼注意頭文件導入,順便說一句VIM真香。