版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、.實(shí)驗(yàn)一、進(jìn)程控制實(shí)驗(yàn)1.1 實(shí)驗(yàn)?zāi)康募由顚τ谶M(jìn)程并發(fā)執(zhí)行概念的理解。實(shí)踐并發(fā)進(jìn)程的創(chuàng)建和控制方法。觀察和體驗(yàn)進(jìn)程的動態(tài)特性。 進(jìn)一步理解進(jìn)程生命期期間創(chuàng)建、變換、撤銷狀態(tài)變換的過程。掌握進(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)說明1)與進(jìn)程創(chuàng)建、執(zhí)行有關(guān)的系統(tǒng)調(diào)用說明進(jìn)程可以通過系統(tǒng)調(diào)用fork() 創(chuàng)建子進(jìn)程并和其子進(jìn)程并發(fā)執(zhí)行. 子進(jìn)程初始的執(zhí)行映像是父進(jìn)程的一個(gè)復(fù)本.子進(jìn)程可以通過exec()系統(tǒng)調(diào)用族裝入一個(gè)新的執(zhí)行程序。父進(jìn)程可以使用wait() 或 waitpid() 系統(tǒng)調(diào)用等待子進(jìn)程的結(jié)束
2、并負(fù)責(zé)收集和清理子進(jìn)程的退出狀態(tài)。fork() 系統(tǒng)調(diào)用語法:#include pid_tfork(void);fork 成功創(chuàng)建子進(jìn)程后將返回子進(jìn)程的進(jìn)程號,不成功會返回-1.exec 系統(tǒng)調(diào)用有一組6 個(gè)函數(shù) ,其中示例實(shí)驗(yàn)中引用了execve 系統(tǒng)調(diào)用語法:#include int execve(const char *path,const char *argv,const char * envp);path 要裝入的新的執(zhí)行文件的絕對路徑名字符串.argv要傳遞給新執(zhí)行程序的完整的命令參數(shù)列表(可以為空 ).envp要傳遞給新執(zhí)行程序的完整的環(huán)境變量參數(shù)列表(可以為空 ).exec 執(zhí)
3、行成功后將用一個(gè)新的程序代替原進(jìn)程,但進(jìn)程號不變,它絕不會再返回到調(diào)用進(jìn)程了。如果exec 調(diào)用失敗,它會返回-1。wait()系統(tǒng)調(diào)用語法:#include #include pid_twait(int *status);pid_t waitpid(pid_t pid,int *status,int option);status 用于保留子進(jìn)程的退出狀態(tài)pid 可以為以下可能值:- 1等待所有 pgid 等于 pid 的絕對值的子進(jìn)程1 等待所有子進(jìn)程0 等待所有 pgid 等于調(diào)用進(jìn)程的子進(jìn)程0等待 pid 等于pid 的子進(jìn)程option 規(guī)定了調(diào)用waitpid 進(jìn)程的行為:wnoha
4、ng沒有子進(jìn)程時(shí)立即返回wuntraced沒有報(bào)告狀態(tài)的進(jìn)程時(shí)返回wait 和 waitpid 執(zhí)行成功將返回終止的子進(jìn)程的進(jìn)程號,不成功返回-1。getpid() 系統(tǒng)調(diào)用語法:#include #include pid_tgetpid(void);pid_t getppid(void);getpid 返回當(dāng)前進(jìn)程的進(jìn)程號,getppid 返回當(dāng)前進(jìn)程父進(jìn)程的進(jìn)程號2) 與進(jìn)程控制有關(guān)的系統(tǒng)調(diào)用說明可以通過信號向一個(gè)進(jìn)程發(fā)送消息以控制進(jìn)程的行為。信號是由中斷或異常事件引發(fā)的,如:鍵盤中斷、定時(shí)器中斷、非法內(nèi)存引.用等。信號的名字都以sig 開頭,例如sigterm 、sighup ??梢允褂?/p>
5、kill -l 命令查看系統(tǒng)當(dāng)前的信號集合。信號可在任何時(shí)間發(fā)生,接收信號的進(jìn)程可以對接收到的信號采取3 種處理措施之一:? 忽略這個(gè)信號? 執(zhí)行系統(tǒng)默認(rèn)的處理? 捕捉這個(gè)信號做自定義的處理信號從產(chǎn)生到被處理所經(jīng)過的過程:產(chǎn)生(generate)- 掛起(pending) - 派送(deliver) - 部署(disposition) 或忽略(igore)一個(gè)信號集合是一個(gè)c 語言的sigset_t 數(shù)據(jù)類型的對象, sigset_t 數(shù)據(jù)類型定義在 中。被一個(gè)進(jìn)程忽略的所有信號的集合稱為一個(gè)信號掩碼(mask)。從程序中向一個(gè)進(jìn)程發(fā)送信號有兩種方法:調(diào)用shell 的 kill命令,調(diào)用ki
6、ll 系統(tǒng)調(diào)用函數(shù)。 kill 能夠發(fā)送除殺死一個(gè)進(jìn)程(sigkill 、 sigterm 、sigquit)之外的其他信號,例如鍵盤中斷(ctrl+c) 信號sigint, 進(jìn)程暫停 (ctrl+z) 信號sigtstp 等等。調(diào)用pause 函數(shù)會令調(diào)用進(jìn)程的執(zhí)行掛起直到一個(gè)任意信號到來后再繼續(xù)運(yùn)行。調(diào)用 sleep 函數(shù)會令調(diào)用進(jìn)程的執(zhí)行掛起睡眠指定的秒數(shù)或一個(gè)它可以響應(yīng)的信號到來后繼續(xù)執(zhí)行。每個(gè)進(jìn)程都能使用signal 函數(shù)定義自己的信號處理函數(shù),捕捉并自行處理接收的除 sigstop 和 sigkill之外的信號。以下是有關(guān)的系統(tǒng)調(diào)用的語法說明。kill系統(tǒng)調(diào)用語法:#include
7、 #include .int kill(pid_t pid, int sig);pid接收信號的進(jìn)程號signal 要發(fā)送的信號kill發(fā)送成功返回接收者的進(jìn)程號,失敗返回-1。pause 系統(tǒng)調(diào)用語法:include intpause(void);pause 掛起調(diào)用它的進(jìn)程直到有任何信號到達(dá)。調(diào)用進(jìn)程不自定義處理方法,則進(jìn)行信號的默認(rèn)處理。只有進(jìn)程自定義了信號處理方法捕獲并處理了一個(gè)信號后,pause 才會返回調(diào)進(jìn)程。pause 總是返回 -1,并設(shè)置系統(tǒng)變量errno 為 eintr 。 sleep系統(tǒng)調(diào)用語法:#include unsigned int sleep(unsigned i
8、nt seconds);seconds 指定進(jìn)程睡眠的秒數(shù)如果指定的秒數(shù)到,sleep 返回0。signal 系統(tǒng)調(diào)用語法為:#include typedef void(*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);signum要捕捉的信號handler進(jìn)程中自定義的信號處理函數(shù)名signal 調(diào)用成功會返回信號處理函數(shù)的返回值,不成功返回 -1,并設(shè)置系統(tǒng)變量errno 為 sig_err 。1.3 示例實(shí)驗(yàn)以下實(shí)驗(yàn)示例程序應(yīng)實(shí)現(xiàn)一個(gè)類似子shell 子命令的功能,它可以從執(zhí)行程序中啟動另一
9、個(gè)新的子進(jìn)程并執(zhí)行一個(gè)新的命令和其并發(fā)執(zhí)行.1) 打開一終端命令行窗體,新建一個(gè)文件夾,在該文件夾中建立以下名為pctl.c 的 c 語言程序:/* filename: pctl.c* copyright: (c) 2006 by zhanghonglie* function: 父子進(jìn)程的并發(fā)執(zhí)行*/#include pctl.hint main(int argc, char *argv)int i;int pid;/存放子進(jìn)程號int status;/存 放 子 進(jìn) 程 返 回 狀 態(tài)char *args=/bin/ls, -a,null;/ 子進(jìn)程要缺省執(zhí)行的命令signal(sigint
10、,(sighandler_t)sigcat);/ 注 冊 一 個(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 語言頭文件:#include #include #include #include #include #include /進(jìn)程自定義的鍵盤中斷信號處理函數(shù)type
11、def void (*sighandler_t) (int); void sigcat()printf(%d process continuen,getpid();3) 建立以下項(xiàng)目管理文件makefilehead = pctl.h srcs = pctl.cobjs = pctl.o opts =-g -call:pctlpctl:$(objs)gcc $(objs) -opctlpctl.o:$(srcs)$(head)gcc $(opts) $(srcs)clean:rm pctl*.o4)輸入make 命令編譯連接生成可執(zhí)行的pctl 程序$ g makegcc -g -c pctl.
12、cgcc pctl.o -opctl5) 執(zhí)行 pctl 程序 (注意進(jìn)程號是動態(tài)產(chǎn)生的 ,每次執(zhí)行都不相同 )$ ./pctli am child process 4113my father is 4112i am parent process4112 wakeup 4113 child.4112 dont wait for child done.4113 process continue4113 child will running: /bin/ls-a. .makefilepctlpctl.cpctl.hpctl.o$以上程序的輸出說明父進(jìn)程4112 創(chuàng)建了一個(gè)子進(jìn)程4113,子進(jìn)程執(zhí)行
13、被暫停。父進(jìn)程向子進(jìn)程發(fā)出鍵盤中斷信號喚醒子進(jìn)程并與子進(jìn)程并發(fā)執(zhí)行。父進(jìn)程并沒有等待子進(jìn)程的結(jié)束繼續(xù)執(zhí)行先行結(jié)束了(此時(shí)的子進(jìn)程成為了孤兒進(jìn)程,不會有父進(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í)行命令的pctl程序 :$ ./pctl /bin/ls -li am child process 4223my father is 4222i am parent process42224222waiting for child
14、done.可以看到這一次子進(jìn)程仍然被掛起,而父進(jìn)程則在等待子進(jìn)程的完成。為了檢測父子進(jìn)程是否都在并發(fā)執(zhí)行,請輸入ctrl+z 將當(dāng)前進(jìn)程放入后臺并輸入ps 命令查看當(dāng)前系統(tǒng)進(jìn)程信息,顯示如下:1+stopped./pctl /bin/ls-l $ ps -lf suid pidppidc prini addr sz wchan tty timecmd0 s0408540830760 -1413 waitpts/100:00:00bash0 t0422240850760 -360 finishpts/100:00:00pctl1 t0422342220760 -360 finishpts/100
15、:00:00pctl0 r0423140850780 -1302 -pts/100:00:00ps可以看到當(dāng)前系統(tǒng)中同時(shí)有兩個(gè)叫pctl的進(jìn)程,它們的進(jìn)程號分別是4222 和 4223 。它們的狀態(tài)都為 t,說明當(dāng)前都被掛起。4223 的父進(jìn)程是4222 ,而 4222 的父進(jìn)程是.4085,也就是bash- shell。為了讓pctl 父子進(jìn)程繼續(xù)執(zhí)行,請輸入fg 命令讓pctl 再次返回前臺,顯示如下:$ fg./pctl /bin/ls-l現(xiàn)在 pctl 父子進(jìn)程從新返回前臺。我們可以通過鍵盤發(fā)鍵盤中斷信號來喚醒pctl 父子進(jìn)程繼續(xù)執(zhí)行,輸入ctrl+c ,將會顯示:4222 proc
16、ess continue4223 process continue4223 child will running: /bin/ls-l total 1708-rw -r- r- 1 root root176 may8 11:11 makefile-rwxr -xr-x 1 root root8095 may8 14:08 pctl-rw -r- r- 1 root root2171 may814:08 pctl.c -rw -r-r- 1 root root269 may 8 11:10 pctl.h-rw -r- r- 1 root root4156 may814:08 pctl.omy child exit! status = 0以上輸出說明了子進(jìn)程在捕捉到鍵盤中斷信號后繼續(xù)執(zhí)行了指定的命令,按我們要求的長格式列出了當(dāng)前目錄中的文件名,父進(jìn)程在接收到子進(jìn)程執(zhí)行結(jié)束的信號后將清理子進(jìn)程的退出狀態(tài)并繼續(xù)執(zhí)行,它報(bào)告了子進(jìn)程的退
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026德江縣縣屬國有企業(yè)招聘13人備考考試題庫附答案解析
- 2026浙江紹興市應(yīng)急管理局選調(diào)下屬事業(yè)單位人員1人參考考試題庫附答案解析
- 2026河南周口淮陽楚氏骨科醫(yī)院招聘備考考試試題附答案解析
- 街道生產(chǎn)經(jīng)營監(jiān)管制度
- 2026國家電投云南國際校園招聘48人備考考試試題附答案解析
- 調(diào)運(yùn)員安全生產(chǎn)責(zé)任制度
- 安全生產(chǎn)診斷檢查制度
- 制劑生產(chǎn)計(jì)劃管理制度
- 塑粉生產(chǎn)車間制度
- 生產(chǎn)車間工模管理及制度
- 2026年各地高三語文1月聯(lián)考文言文匯編(文言詳解+挖空)
- 2026年春季統(tǒng)編版三年級下冊小學(xué)語文教學(xué)計(jì)劃(含進(jìn)度表)
- 家庭醫(yī)生簽約服務(wù)工作實(shí)施方案
- 冰箱安裝施工方案
- 村委安全生產(chǎn)責(zé)任制度
- 2025-2030中國碳酸氫鈉市場未來前瞻及投資戰(zhàn)略規(guī)劃策略建議研究報(bào)告
- 土石方開挖與回填施工方案
- 2025年12月廣西區(qū)一模語文2025-2026年度首屆廣西職教高考第一次模擬考試2026年廣西高等職業(yè)教育考試模擬測試語文含逐題答案解釋99
- 2026元旦主題班會:馬年猜猜樂猜成語 (共130題)【課件】
- 2026年盤錦職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及參考答案詳解一套
- YY/T 1778.1-2021醫(yī)療應(yīng)用中呼吸氣體通路生物相容性評價(jià)第1部分:風(fēng)險(xiǎn)管理過程中的評價(jià)與試驗(yàn)
評論
0/150
提交評論