




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗一、進程控制實驗1.1實驗目的加深對于進程并發執行概念的理解。實踐并發進程的創建和控制方法。觀察和體驗進程的動態特性。進一步理解進程生命期期間創建、變換、撤銷狀態變換的過程。掌握進程控制的方法,了解父子進程間的控制和協作關系。練習Linux系統中進程創建與控制有關的系統調用的編程和調試技術。1.2實驗說明1)與進程創建、執行有關的系統調用說明進程可以通過系統調用fork()創建子進程并和其子進程并發執行子進程初始的執行映像是父進程的一個復本子進程可以通過exec()系統調用族裝入一個新的執行程序。父進程可以使用wait()或waitpid()系統調用等待子進程的結束并負責收集和清理子進程的
2、退出狀態。fork()系統調用語法:#in clude <uni std.h>pid_tfork(void);fork成功創建子進程后將返回子進程的進程號,不成功會返回-1.exec系統調用有一組6個函數,其中示例實驗中引用了execve系統調用語法:#in clude <uni std.h>int execve(c onst char *path, const char *argv,const char * en vp);path 要裝入的新的執行文件的絕對路徑名字符串argv要傳遞給新執行程序的完整的命令參數列表(可以為空).envp要傳遞給新執行程序的完整的環境變
3、量參數列表(可以為空).用等。信號的名字都以SIG開頭,例如 SIGTERM、SIGHUP。可以使用 kill -I命調用進程了。如果exec調用失敗,它會返回-1wait()系統調用語法:#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 用 于保留子進程的退出狀態pid可以為以下可能值:-1等待所有 PGID等于PID的絕對值的子進程1等待所有子進程0等待所有PGID
4、等于調用進程的子進程>0 等待PID等于pid的子進程 option規定了調用waitpid進程的行為:WNOHANG沒有子進程時立即返回WUNTRACED沒有報告狀態的進程時返回wait和waitpid執行成功將返回終止的子進程的進程號,不成功返回-1。getpid()系統調用語法:#in clude <sys/types.h>#in clude <uni std.h>pid_tgetpid(void);pid_t getppid(void);getpid返回當前進程的進程號,getppid返回當前進程父進程的進程號2)與進程控制有關的系統調用說明可以通過信號向
5、一個進程發送消息以控制進程的行為。信號是由中斷或異常事件引發的,如:鍵盤中斷、定時器中斷、非法內存引令查看系統當前的信號集合。信號可在任何時間發生,接收信號的進程可以對接收到的信號采取3種處理措施之' .?忽略這個信號?執行系統默認的處理?捕捉這個信號做自定義的處理信號從產生到被處理所經過的過程:產生(generate)-> 掛起(pending)-> 派送(deliver)-部署(disposition)或忽略(igore)一個信號集合是一個C語言的sigset_t數據類型的對象,sigset_t數據類型定義在<signal.h>中。被一個進程忽略的所有信號的
6、集合稱為一個信號掩碼(mask)。從程序中向一個進程發送信號有兩種方法:調用shell的kill命令,調用kill系統調用函數。kill能夠發送除殺死一個進程(SIGKILL、SIGTERM、SIGQUIT)之外的其他信號,例如鍵盤中斷(Ctrl+C)信號SIGINT,進程暫停(Ctrl+Z)信號SIGTSTP 等等。調用Pause函數會令調用進程的執行掛起直到一個任意信號到來后再繼續運行。調用sleep函數會令調用進程的執行掛起睡眠指定的秒數或一個它可以響應的信號到來后繼續執行。每個進程都能使用sig nal函數定義自己的信號處理函數,捕捉并自行處理接收的除SIGSTOP和SIGKILL之外
7、的信號。以下是有關的系統調用的語法說明。kill系統調用語法:#in elude <sys/types.h>#in elude <sig nal.h>int kill(pid_t pid, int sig);pid接收信號的進程號sig nal要發送的信號kill發送成功返回接收者的進程號,失敗返回-1。pause系統調用語法:# in elude <uni std.h> intpause(void);pause掛起調用它的進程直到有任何信號到達。調用進程不自定義處理方法,則進行信號的默認處理。只有進程自定義了信號處理方法捕獲并處理了一個信號后,pause才
8、會返回調進程。pause總是返回-1,并設置系統變量errno為EINTR。sleep系統調用語法:#in clude <uni std.h>un sig ned int sleep( un sig ned int sec on ds);seco nds指定進程睡眠的秒數如果指定的秒數到,sleep返回0。signal系統調用語法為:#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進程中自定義的信號處理函數名signal調用成功會返回信號處理函數的返回值,不成功返回-1,并設置系統變量errno 為 SIG_ERR。1.3示例實驗以下實驗示例程序應實現一個類似子shell子命令的功能,它可以從執行程序中啟動另一個新的子進程并執行一個新的命令和其并發執行1)打開一終端命令行窗體,新建一個文件夾,在該文件夾中建立以下名為pctl.c的C語言程序:/* File name: pctl.c* copyright: (C) 2006 by zhanghonglie* Function:父子進程的并發執行*/#i nclude "pct
10、l.h"int main (i nt argc, char *argv) int i;int pid;/存放子進程號int status; /存放子進程返回狀態 char *args="/bin/Is"," -a",NULL;/子進程要缺省執行的命令sig nal(SIGINT,(sigha ndler_t)sigcat);/注冊一個本進程處理鍵盤中斷的函數pid=fork() ; / 建立子進程 if(pid<0) / 建立子進程失敗?prin tf("Create Process fail!n");exit(EXI
11、T_FAILURE);if(pid = 0) /子進程執行代碼段/報告父子進程進程號prin tf("I am Child process %dnMy father is %dn",getpid(),getppid();pause();暫停,等待鍵盤中斷信號喚醒子進程被鍵盤中斷信號喚醒繼續執行if(argv1 != NULL)printf("%d child will Running:n ",getpid(); /如果在命令行上輸入了子進程要執行的命令則執行輸入的命令for(i=1; argvi != NULL; i+)prin tf("%s
12、”,argvi);prin tf("n");/裝入并執行新的程序status = execve(argv1,&argv1,NULL); else如果在命令行上沒輸入子進程要執行的命令則執行缺省的命令for(i=0; argsi != NULL; i+) prin tf("%s ",argsi);prin tf("n");/裝入并執行新的程序status = execve(args0,args,NULL);else 父進程執行代碼段prin tf("nl am Pare nt process%dn",getp
13、id(); / 報告父進程進程號if(argv1 != NULL)如果在命令行上輸入了子進程要執行的命令則父進程等待子進程執行結束printf("%dWaiting for child done.nn" ,pid );waitpid(pid,&status,0);等待子進程結束prin tf("nMy child exit! status = %dnn",status); else/如果在命令行上沒輸入子進程要執行的命令/喚醒子進程,與子進程并發執行不等待子進程執行結束,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>/進程自定義的鍵盤中斷信號處理函數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命令編譯連接生成可執行的pctl程序$ g makegcc -g -c pctl.cgcc pctl.o -o pctl5) 執行pctl程序(注意進程號是動態產生的,每次執行都不相同)$ ./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創建了一個子進程4113,子進程執行被暫停。父進程向子進程發出鍵盤中斷信號喚醒子進程并與子進程并發執行。父進程并沒有等待子進程的結束繼續執行先行結束了(此時的子進程成為了孤兒進程,不會有父進程為它清理退出狀態了)。而子進程繼續執行,它變成了列出當前目錄所有文件名的命令ls -a。在完成了列出文件名命令之后,子進程的執行也結束了。此時子進程的退出狀態將有初始化進程為它清理。6)再次執行帶有子進程指定執行命令的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。程是否都在并發執行,請輸入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說明當前都被掛起。4223的父進程是4222,而4222的父進程是4085,也就是bash-shell。為了讓pctl父子進程繼續執行,請輸入 fg命令讓pctl再次返回前臺,顯示如下:$ fg./pctl /bin/ls -l現在pctl父子進程從新返回前臺。我們可以通過鍵盤發鍵盤中斷信號來喚醒pctl父子進程繼續執行,輸入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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 磨難的中考語文作文
- 纖維板生產中的員工培訓與管理考核試卷
- 智能電動牙刷智能識別考核試卷
- 生活就像一首歌初三語文作文
- 殘疾人座車交通事故應急預案考核試卷
- 描寫巴黎的初二語文作文
- 紡織品在包裝行業的應用與發展考核試卷
- 電力施工項目施工圖紙識別考核試卷
- 發熱患者的護理指南
- 護理不良事件報告及管理制度 2
- 2025年國家電投所屬國核鈾業招聘筆試參考題庫含答案解析
- 小學生打架班會課件
- 參展商服務手冊
- 隨機過程-華東師范大學中國大學mooc課后章節答案期末考試題庫2023年
- 湖南省對口招生考試醫衛專業試題(2024-2025年)
- 公共危機管理(本)-第五次形成性考核-國開(BJ)-參考資料
- 孕期碘缺乏病的健康宣教
- 電梯調試單機試車方案
- 【MOOC】面向對象程序設計-濮陽職業技術學院 中國大學慕課MOOC答案
- 子宮平滑肌瘤手術臨床路徑表單
- GB/T 36547-2024電化學儲能電站接入電網技術規定
評論
0/150
提交評論