實驗五:Linux進程管理

實驗五:Linux進程管理

一、實驗目的

  1. 熟練使用進程操作函數編寫程序。
  2. 熟練掌握exec函數族的用法。
  3. 掌握同步進程的方法。

二、實驗環境

Ubantu或Centos

三、實驗內容

1.創建進程

  • 創建一個進程
  • 利用循環結構創建多個進程

2.exec函數族

使用execv()函數調用用戶程序,更改子進程的功能。

3.進程同步

使用循環創建多個子進程,使用wait()函數完成所有子進程的回收工作。

4.進程管理命令

熟練使用進程管理命令管理與查看進程信息。
需練習的進程管理命令有:pstoppstreepgrepnicebgfgjobskill

四、實驗步驟

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的取值及其意義分別如下:

    1. pid>0時,只等待pid與該參數相同的子進程;
    2. pid=-1時,waitpid()函數與wait()函數作用相同,將阻塞等待並回收一個子進程;
    3. pid=0時,等待同一個進程組的所有子進程;
    4. pid<-1時,等待指定進程組中的任何子進程,進程組的id等於pid的絕對值。
  • 參數options提供控制waitpid()的選項,該選項是一個常量,或由|連接的兩個常量。該選項支持的選項如下:

    1. WNOHANG,即使子進程沒有終止,waitpid()也會立即返回;
    2. WUNTRACED,如果子進程暫停執行,則waitpid()立刻返回;
    3. 若不想使用該參數,可以將其值設置爲0
  • waitpid()函數的返回值會出現3種情況:

    1. 正常返回時,waitpid()返回捕捉到的子進程的pid
    2. options的值爲WNOHANG,但調用waitpid()時發現沒有已退出的子進程可收集,則返回0
    3. 若調用過程出錯,返回-1errno會被設置成相應的值以指示錯誤位置。

進程同步的實現

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真香。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章