操作系統(tǒng)實驗-進程控制_第1頁
操作系統(tǒng)實驗-進程控制_第2頁
操作系統(tǒng)實驗-進程控制_第3頁
操作系統(tǒng)實驗-進程控制_第4頁
操作系統(tǒng)實驗-進程控制_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

2、退出狀態(tài)。fork()系統(tǒng)調(diào)用語法:#in clude <uni std.h>pid_tfork(void);fork成功創(chuàng)建子進程后將返回子進程的進程號,不成功會返回-1.exec系統(tǒng)調(diào)用有一組6個函數(shù),其中示例實驗中引用了execve系統(tǒng)調(diào)用語法:#in clude <uni std.h>int execve(c onst char *path, const char *argv,const char * en vp);path 要裝入的新的執(zhí)行文件的絕對路徑名字符串a(chǎn)rgv要傳遞給新執(zhí)行程序的完整的命令參數(shù)列表(可以為空).envp要傳遞給新執(zhí)行程序的完整的環(huán)境變

3、量參數(shù)列表(可以為空).用等。信號的名字都以SIG開頭,例如 SIGTERM、SIGHUP??梢允褂?kill -I命調(diào)用進程了。如果exec調(diào)用失敗,它會返回-1wait()系統(tǒng)調(diào)用語法:#in elude <sys/types.h>pid_t#i nclude <sys/wait.h>wait(i nt *status);pid_t waitpid(pid_t pid,i nt *status,i nt opti on);status 用 于保留子進程的退出狀態(tài)pid可以為以下可能值:-1等待所有 PGID等于PID的絕對值的子進程1等待所有子進程0等待所有PGID

4、等于調(diào)用進程的子進程>0 等待PID等于pid的子進程 option規(guī)定了調(diào)用waitpid進程的行為:WNOHANG沒有子進程時立即返回WUNTRACED沒有報告狀態(tài)的進程時返回wait和waitpid執(zhí)行成功將返回終止的子進程的進程號,不成功返回-1。getpid()系統(tǒng)調(diào)用語法:#in clude <sys/types.h>#in clude <uni std.h>pid_tgetpid(void);pid_t getppid(void);getpid返回當前進程的進程號,getppid返回當前進程父進程的進程號2)與進程控制有關(guān)的系統(tǒng)調(diào)用說明可以通過信號向

5、一個進程發(fā)送消息以控制進程的行為。信號是由中斷或異常事件引發(fā)的,如:鍵盤中斷、定時器中斷、非法內(nèi)存引令查看系統(tǒng)當前的信號集合。信號可在任何時間發(fā)生,接收信號的進程可以對接收到的信號采取3種處理措施之' .?忽略這個信號?執(zhí)行系統(tǒng)默認的處理?捕捉這個信號做自定義的處理信號從產(chǎn)生到被處理所經(jīng)過的過程:產(chǎn)生(generate)-> 掛起(pending)-> 派送(deliver)-部署(disposition)或忽略(igore)一個信號集合是一個C語言的sigset_t數(shù)據(jù)類型的對象,sigset_t數(shù)據(jù)類型定義在<signal.h>中。被一個進程忽略的所有信號的

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

7、的信號。以下是有關(guān)的系統(tǒng)調(diào)用的語法說明。kill系統(tǒng)調(diào)用語法:#in elude <sys/types.h>#in elude <sig nal.h>int kill(pid_t pid, int sig);pid接收信號的進程號sig nal要發(fā)送的信號kill發(fā)送成功返回接收者的進程號,失敗返回-1。pause系統(tǒng)調(diào)用語法:# in elude <uni std.h> intpause(void);pause掛起調(diào)用它的進程直到有任何信號到達。調(diào)用進程不自定義處理方法,則進行信號的默認處理。只有進程自定義了信號處理方法捕獲并處理了一個信號后,pause才

8、會返回調(diào)進程。pause總是返回-1,并設(shè)置系統(tǒng)變量errno為EINTR。sleep系統(tǒng)調(diào)用語法:#in clude <uni std.h>un sig ned int sleep( un sig ned int sec on ds);seco nds指定進程睡眠的秒數(shù)如果指定的秒數(shù)到,sleep返回0。signal系統(tǒng)調(diào)用語法為:#in clude <sig nal.h> typedef void(*sigha ndler_t)(i nt);sigha ndler_t sig nal( int sig num, sigha ndler_t han dler);sig

9、 num要捕捉的信號han dler進程中自定義的信號處理函數(shù)名signal調(diào)用成功會返回信號處理函數(shù)的返回值,不成功返回-1,并設(shè)置系統(tǒng)變量errno 為 SIG_ERR。1.3示例實驗以下實驗示例程序應(yīng)實現(xiàn)一個類似子shell子命令的功能,它可以從執(zhí)行程序中啟動另一個新的子進程并執(zhí)行一個新的命令和其并發(fā)執(zhí)行1)打開一終端命令行窗體,新建一個文件夾,在該文件夾中建立以下名為pctl.c的C語言程序:/* File name: pctl.c* copyright: (C) 2006 by zhanghonglie* Function:父子進程的并發(fā)執(zhí)行*/#i nclude "pct

10、l.h"int main (i nt argc, char *argv) int i;int pid;/存放子進程號int status; /存放子進程返回狀態(tài) char *args="/bin/Is"," -a",NULL;/子進程要缺省執(zhí)行的命令sig nal(SIGINT,(sigha ndler_t)sigcat);/注冊一個本進程處理鍵盤中斷的函數(shù)pid=fork() ; / 建立子進程 if(pid<0) / 建立子進程失???prin tf("Create Process fail!n");exit(EXI

11、T_FAILURE);if(pid = 0) /子進程執(zhí)行代碼段/報告父子進程進程號prin tf("I am Child process %dnMy father is %dn",getpid(),getppid();pause();暫停,等待鍵盤中斷信號喚醒子進程被鍵盤中斷信號喚醒繼續(xù)執(zhí)行if(argv1 != NULL)printf("%d child will Running:n ",getpid(); /如果在命令行上輸入了子進程要執(zhí)行的命令則執(zhí)行輸入的命令for(i=1; argvi != NULL; i+)prin tf("%s

12、”,argvi);prin tf("n");/裝入并執(zhí)行新的程序status = execve(argv1,&argv1,NULL); else如果在命令行上沒輸入子進程要執(zhí)行的命令則執(zhí)行缺省的命令for(i=0; argsi != NULL; i+) prin tf("%s ",argsi);prin tf("n");/裝入并執(zhí)行新的程序status = execve(args0,args,NULL);else 父進程執(zhí)行代碼段prin tf("nl am Pare nt process%dn",getp

13、id(); / 報告父進程進程號if(argv1 != NULL)如果在命令行上輸入了子進程要執(zhí)行的命令則父進程等待子進程執(zhí)行結(jié)束printf("%dWaiting for child done.nn" ,pid );waitpid(pid,&status,0);等待子進程結(jié)束prin tf("nMy child exit! status = %dnn",status); else/如果在命令行上沒輸入子進程要執(zhí)行的命令/喚醒子進程,與子進程并發(fā)執(zhí)行不等待子進程執(zhí)行結(jié)束,if(kill(pid,SIGINT) >= 0)prin tf(&q

14、uot;%d Wakeup %d child.n",getpid(),pid) ;prin tf("%d don't Wait forchild don e.nn ”,getpid(); return EXIT_SUCCESS;2)再建立以下名為pctl.h的C語言頭文件:#in clude <sys/types.h>#in clude <wait.h>#in clude <uni std.h>#in clude <sig nal.h>#i nclude <stdio.h>#i nclude <std

15、lib.h>/進程自定義的鍵盤中斷信號處理函數(shù)typedef void (*sigha ndler_t) (in t); void sigcat() printf("%d Process continuen",getpid();3) 建立以下項目管理文件Makefilehead = pctl.h srcs = pctl.c objs = pctl.o opts =-g -call: pctlpctl:$(objs)gcc $(objs) -o pctl pctl.o:$(srcs) $(head)gcc $(opts) $(srcs) clean:rm pctl *.

16、o4)輸入make命令編譯連接生成可執(zhí)行的pctl程序$ g makegcc -g -c pctl.cgcc pctl.o -o pctl5) 執(zhí)行pctl程序(注意進程號是動態(tài)產(chǎn)生的,每次執(zhí)行都不相同)$ ./pctlI am Child process 4113My father is 4112I am Pare nt process 4112 Wakeup 4113 child.4112 don't Wait for child done.4113 Process continue4113 child will Ru nning:/bin/Is -a.Makefile pctl

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

18、 is 4222I am Pare nt process 42224222 Waiting for child done.可以看到這一次子進程仍然被掛起,而父進程則在等待子進程的完成。為了檢測父子進pctl的進程,它們的進程號分別是4222和4223。程是否都在并發(fā)執(zhí)行,請輸入ctrl+z將當前進程放入后臺并輸入ps命令查看當前系1+Stopped./pctl /bin/ls-l $ ps -lF SUID PIDPPIDC PRINI ADDR SZ WCHAN TTY TIMECMD0 S0408540830760-1413 waitpts/100:00:00bash0T042224085

19、0760-360 finishpts/100:00:00pctl1 T0422342220760-360 finishpts/100:00:00pctl0 R0423140850780 -1302 -pts/100:00:00ps統(tǒng)進程信息,顯示如下:可以看到當前系統(tǒng)中同時有兩個叫它們的狀態(tài)都為 一T說明當前都被掛起。4223的父進程是4222,而4222的父進程是4085,也就是bash-shell。為了讓pctl父子進程繼續(xù)執(zhí)行,請輸入 fg命令讓pctl再次返回前臺,顯示如下:$ fg./pctl /bin/ls -l現(xiàn)在pctl父子進程從新返回前臺。我們可以通過鍵盤發(fā)鍵盤中斷信號來喚醒pctl父子進程繼續(xù)執(zhí)行,輸入ctrl+c,將會顯示:4222 Process continue4223 Process continue4223 child will Ru nning: /bin/ls-l total 1708-rw-r-r- 1 root root 176 May 8 11:11 Makefile-rwxr-xr-x 1 root root 8095 May 8 14:08 pctl-rw-r-r- 1 root root 2

溫馨提示

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

最新文檔

評論

0/150

提交評論