操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程控制_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程控制_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程控制_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程控制_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程控制_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.實(shí)驗(yàn)一、進(jìn)程控制實(shí)驗(yàn) 1.1 實(shí)驗(yàn)?zāi)康?加深對(duì)于進(jìn)程并發(fā)執(zhí)行概念的理解。實(shí)踐并發(fā)進(jìn)程的創(chuàng)建和控制方法。觀察和體驗(yàn)進(jìn)程的動(dòng)態(tài)特性。進(jìn)一步理解進(jìn)程生命期期間創(chuàng)建、變換、撤銷狀態(tài)變換的過(guò)程。掌握進(jìn)程控制的方法,了解父子進(jìn)程間的控制和協(xié)作關(guān)系。練習(xí) Linux 系統(tǒng)中進(jìn)程創(chuàng)建與控制有關(guān)的系統(tǒng)調(diào)用的編程和調(diào)試技術(shù)。 1.2 實(shí)驗(yàn)說(shuō)明 1)與進(jìn)程創(chuàng)建、執(zhí)行有關(guān)的系統(tǒng)調(diào)用說(shuō)明 進(jìn)程可以通過(guò)系統(tǒng)調(diào)用fork()創(chuàng)建子進(jìn)程并和其子進(jìn)程并發(fā)執(zhí)行.子進(jìn)程初始的執(zhí)行映像是父進(jìn)程的一個(gè)復(fù)本.子進(jìn)程可以通過(guò) exec()系統(tǒng)調(diào)用族裝入一個(gè)新的執(zhí)行程序。父進(jìn)程可以使用 wait()或 waitpid()系統(tǒng)調(diào)用等待子進(jìn)程

2、的結(jié)束并負(fù)責(zé)收集和清理子進(jìn)程的退出狀態(tài)。 fork()系統(tǒng)調(diào)用語(yǔ)法: #include pid_t fork(void); fork 成功創(chuàng)建子進(jìn)程后將返回子進(jìn)程的進(jìn)程號(hào),不成功會(huì)返回-1. exec 系統(tǒng)調(diào)用有一組 6 個(gè)函數(shù),其中示例實(shí)驗(yàn)中引用了 execve 系統(tǒng)調(diào)用語(yǔ)法: #include int execve(const char *path, const char *argv, const char * envp); path 要裝入的新的執(zhí)行文件的絕對(duì)路徑名字符串. argv 要傳遞給新執(zhí)行程序的完整的命令參數(shù)列表(可以為空). envp 要傳遞給新執(zhí)行程序的完整的環(huán)境變量參數(shù)列

3、表(可以為空). Exec 執(zhí)行成功后將用一個(gè)新的程序代替原進(jìn)程,但進(jìn)程號(hào)不變,它絕不會(huì)再返回到調(diào)用進(jìn)程了。如果 exec 調(diào)用失敗,它會(huì)返回-1。 wait() 系統(tǒng)調(diào)用語(yǔ)法: #include #include pid_t wait(int *status); pid_t waitpid(pid_t pid,int *status,int option); status 用于保留子進(jìn)程的退出狀態(tài) pid 可以為以下可能值: -1 等待所有 PGID 等于 PID 的絕對(duì)值的子進(jìn)程 1 等待所有子進(jìn)程 0 等待所有 PGID 等于調(diào)用進(jìn)程的子進(jìn)程 0 等待 PID 等于 pid 的子進(jìn)程 o

4、ption 規(guī)定了調(diào)用 waitpid 進(jìn)程的行為: WNOHANG 沒有子進(jìn)程時(shí)立即返回 WUNTRACED 沒有報(bào)告狀態(tài)的進(jìn)程時(shí)返回 wait 和 waitpid 執(zhí)行成功將返回終止的子進(jìn)程的進(jìn)程號(hào),不成功返回-1。 getpid()系統(tǒng)調(diào)用語(yǔ)法: #include #include pid_t getpid(void); pid_t getppid(void); getpid 返回當(dāng)前進(jìn)程的進(jìn)程號(hào),getppid 返回當(dāng)前進(jìn)程父進(jìn)程的進(jìn)程號(hào) 2) 與進(jìn)程控制有關(guān)的系統(tǒng)調(diào)用說(shuō)明 可以通過(guò)信號(hào)向一個(gè)進(jìn)程發(fā)送消息以控制進(jìn)程的行為。信號(hào)是由中斷或異常事件引發(fā)的,如:鍵盤中斷、定時(shí)器中斷、非法內(nèi)存

5、引用等。信號(hào)的名字都以 SIG 開頭,例如 SIGTERM、SIGHUP??梢允褂?kill -l 命令查看系統(tǒng)當(dāng)前的信號(hào)集合。 信號(hào)可在任何時(shí)間發(fā)生,接收信號(hào)的進(jìn)程可以對(duì)接收到的信號(hào)采取3種處理措施之一: 忽略這個(gè)信號(hào) 執(zhí)行系統(tǒng)默認(rèn)的處理 捕捉這個(gè)信號(hào)做自定義的處理信號(hào)從產(chǎn)生到被處理所經(jīng)過(guò)的過(guò)程: 產(chǎn)生 (generate)- 掛起 (pending)- 派送 (deliver)- 部署 (disposition) 或忽略(igore) 一個(gè)信號(hào)集合是一個(gè) C 語(yǔ)言的 sigset_t 數(shù)據(jù)類型的對(duì)象,sigset_t 數(shù)據(jù)類型定義在中。被一個(gè)進(jìn)程忽略的所有信號(hào)的集合稱為一個(gè)信號(hào)掩碼(mas

6、k)。 從程序中向一個(gè)進(jìn)程發(fā)送信號(hào)有兩種方法:調(diào)用 shell 的 kill 命令,調(diào)用kill系統(tǒng)調(diào)用函數(shù)。kill能夠發(fā)送除殺死一個(gè)進(jìn)程(SIGKILL、SIGTERM、SIGQUIT) 之外的其他信號(hào),例如鍵盤中斷(Ctrl+C)信號(hào) SIGINT,進(jìn)程暫停(Ctrl+Z)信號(hào)SIGTSTP 等等。 調(diào)用 Pause 函數(shù)會(huì)令調(diào)用進(jìn)程的執(zhí)行掛起直到一個(gè)任意信號(hào)到來(lái)后再繼續(xù)運(yùn)行。 調(diào)用 sleep 函數(shù)會(huì)令調(diào)用進(jìn)程的執(zhí)行掛起睡眠指定的秒數(shù)或一個(gè)它可以響應(yīng)的信號(hào)到來(lái)后繼續(xù)執(zhí)行。 每個(gè)進(jìn)程都能使用 signal 函數(shù)定義自己的信號(hào)處理函數(shù),捕捉并自行處理接收的除 SIGSTOP 和 SIGKI

7、LL 之外的信號(hào)。以下是有關(guān)的系統(tǒng)調(diào)用的語(yǔ)法說(shuō)明。 kill 系統(tǒng)調(diào)用語(yǔ)法: #include #include int kill(pid_t pid, int sig); pid 接收信號(hào)的進(jìn)程號(hào) signal 要發(fā)送的信號(hào) kill 發(fā)送成功返回接收者的進(jìn)程號(hào),失敗返回-1。 pause 系統(tǒng)調(diào)用語(yǔ)法: include int pause(void); pause 掛起調(diào)用它的進(jìn)程直到有任何信號(hào)到達(dá)。調(diào)用進(jìn)程不自定義處理方法,則進(jìn)行信號(hào)的默認(rèn)處理。只有進(jìn)程自定義了信號(hào)處理方法捕獲并處理了一個(gè)信號(hào)后,pause 才會(huì)返回調(diào)進(jìn)程。pause 總是返回-1,并設(shè)置系統(tǒng)變量 errno 為 EIN

8、TR。 sleep 系統(tǒng)調(diào)用語(yǔ)法: #include unsigned int sleep(unsigned int seconds); seconds 指定進(jìn)程睡眠的秒數(shù)如果指定的秒數(shù)到,sleep 返回 0。 signal 系統(tǒng)調(diào)用語(yǔ)法為: #include typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); signum 要捕捉的信號(hào) handler 進(jìn)程中自定義的信號(hào)處理函數(shù)名 signal 調(diào)用成功會(huì)返回信號(hào)處理函數(shù)的返回值,不成功返回-1,并設(shè)置系統(tǒng)變量

9、errno 為 SIG_ERR。 1.3 示例實(shí)驗(yàn) 以下實(shí)驗(yàn)示例程序應(yīng)實(shí)現(xiàn)一個(gè)類似子 shell 子命令的功能,它可以從執(zhí)行程序中啟動(dòng)另一個(gè)新的子進(jìn)程并執(zhí)行一個(gè)新的命令和其并發(fā)執(zhí)行. 1) 打開一終端命令行窗體,新建一個(gè)文件夾,在該文件夾中建立以下名為pctl.c 的C語(yǔ)言程序: /* * Filename : pctl.c * copyright : (C) 2006 by zhanghonglie * Function : 父子進(jìn)程的并發(fā)執(zhí)行 */ #include pctl.h int main(int argc, char *argv) int i; int pid; /存放子進(jìn)程號(hào)

10、int status; /存放子進(jìn)程返回狀態(tài) char *args = /bin/ls,-a,NULL; /子進(jìn)程要缺省執(zhí)行的命令 signal(SIGINT,(sighandler_t)sigcat); /注冊(cè)一個(gè)本進(jìn)程處理鍵盤中斷的函數(shù) pid=fork() ; /建立子進(jìn)程 if(pid= 0) printf(%d Wakeup %d child.n,getpid(),pid) ; printf(%d dont Wait for child done.nn,getpid(); return EXIT_SUCCESS; 2) 再建立以下名為 pctl.h 的 C 語(yǔ)言頭文件: #inclu

11、de #include #include #include #include #include /進(jìn)程自定義的鍵盤中斷信號(hào)處理函數(shù) typedef void (*sighandler_t) (int); void sigcat() printf(%d Process continuen,getpid(); 3) 建立以下項(xiàng)目管理文件 Makefile head = pctl.h srcs = pctl.c objs = pctl.o opts = -g -c all: pctl pctl: $(objs) gcc $(objs) -o pctl pctl.o: $(srcs) $(head)

12、gcc $(opts) $(srcs) clean: rm pctl *.o 4) 輸入 make 命令編譯連接生成可執(zhí)行的 pctl 程序 $ gmake gcc -g -c pctl.c gcc pctl.o -o pctl 5) 執(zhí)行 pctl 程序(注意進(jìn)程號(hào)是動(dòng)態(tài)產(chǎn)生的,每次執(zhí)行都不相同) $ ./pctl I am Child process 4113 My father is 4112 I am Parent process 4112 Wakeup 4113 child. 4112 dont Wait for child done. 4113 Process continue 4

13、113 child will Running: /bin/ls -a . . Makefile pctl pctl.c pctl.h pctl.o $ 以上程序的輸出說(shuō)明父進(jìn)程 4112 創(chuàng)建了一個(gè)子進(jìn)程 4113,子進(jìn)程執(zhí)行被暫停。父進(jìn)程向子進(jìn)程發(fā)出鍵盤中斷信號(hào)喚醒子進(jìn)程并與子進(jìn)程并發(fā)執(zhí)行。父進(jìn)程并沒有等待子進(jìn)程的結(jié)束繼續(xù)執(zhí)行先行結(jié)束了(此時(shí)的子進(jìn)程成為了孤兒進(jìn)程,不會(huì)有父進(jìn)程為它清理退出狀態(tài)了)。而子進(jìn)程繼續(xù)執(zhí)行,它變成了列出當(dāng)前目錄所有文件名的命令 ls -a。在完成了列出文件名命令之后,子進(jìn)程的執(zhí)行也結(jié)束了。此時(shí)子進(jìn)程的退出狀態(tài)將有初始化進(jìn)程為它清理。 6) 再次執(zhí)行帶有子進(jìn)程指定執(zhí)行

14、命令的 pctl 程序: $ ./pctl /bin/ls -l I am Child process 4223 My father is 4222 I am Parent process 4222 4222 Waiting for child done. 可以看到這一次子進(jìn)程仍然被掛起,而父進(jìn)程則在等待子進(jìn)程的完成。為了檢測(cè)父子進(jìn)程是否都在并發(fā)執(zhí)行,請(qǐng)輸入 ctrl+z 將當(dāng)前進(jìn)程放入后臺(tái)并輸入 ps 命令查看當(dāng)前系統(tǒng)進(jìn)程信息,顯示如下: 1+ Stopped ./pctl /bin/ls -l $ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN

15、TTY TIME CMD 0 S 0 4085 4083 0 76 0 - 1413 wait pts/1 00:00:00 bash 0 T 0 4222 4085 0 76 0 - 360 finish pts/1 00:00:00 pctl 1 T 0 4223 4222 0 76 0 - 360 finish pts/1 00:00:00 pctl 0 R 0 4231 4085 0 78 0 - 1302 - pts/1 00:00:00 ps 可以看到當(dāng)前系統(tǒng)中同時(shí)有兩個(gè)叫 pctl 的進(jìn)程,它們的進(jìn)程號(hào)分別是 4222 和 4223。它們的狀態(tài)都為T,說(shuō)明當(dāng)前都被掛起。4223

16、的父進(jìn)程是 4222,而 4222 的父進(jìn)程是 4085,也就是 bash-shell。為了讓 pctl 父子進(jìn)程繼續(xù)執(zhí)行,請(qǐng)輸入 fg 命令讓 pctl 再次返回前臺(tái),顯示如下: $ fg ./pctl /bin/ls -l 現(xiàn)在pctl父子進(jìn)程從新返回前臺(tái)。我們可以通過(guò)鍵盤發(fā)鍵盤中斷信號(hào)來(lái)喚醒pctl 父子進(jìn)程繼續(xù)執(zhí)行,輸入 ctrl+c,將會(huì)顯示: 4222 Process continue 4223 Process continue 4223 child will Running: /bin/ls -l total 1708 -rw-r-r- 1 root root 176 May 8

17、 11:11 Makefile -rwxr-xr-x 1 root root 8095 May 8 14:08 pctl -rw-r-r- 1 root root 2171 May 8 14:08 pctl.c -rw-r-r- 1 root root 269 May 8 11:10 pctl.h -rw-r-r- 1 root root 4156 May 8 14:08 pctl.o My child exit! status = 0 以上輸出說(shuō)明了子進(jìn)程在捕捉到鍵盤中斷信號(hào)后繼續(xù)執(zhí)行了指定的命令,按我們要求的長(zhǎng)格式列出了當(dāng)前目錄中的文件名,父進(jìn)程在接收到子進(jìn)程執(zhí)行結(jié)束的信號(hào)后將清理子進(jìn)程的退出狀態(tài)并繼

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論