版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、實驗七 編寫多進(jìn)程程序?qū)W生姓名: 李亞軍 學(xué) 號: 6100412196 專業(yè)班級: 卓越計科121班 1實驗?zāi)康耐ㄟ^編寫多進(jìn)程程序,使讀者熟練掌握fork()、exec()、wait()和waitpid()等函數(shù)的使用,進(jìn)一步理解在Linux中多進(jìn)程編程的步驟。2實驗內(nèi)容該實驗有3個進(jìn)程,其中一個為父進(jìn)程,其余兩個是該父進(jìn)程創(chuàng)建的子進(jìn)程,其中一個子進(jìn)程運行“l(fā)s -l”指令,另一個子進(jìn)程在暫停5s之后異常退出,父進(jìn)程先用阻塞方式等待第一個子進(jìn)程的結(jié)束,然后用非阻塞方式等待另一個子進(jìn)程的退出,待收集到第二個子進(jìn)程結(jié)束的信息,父進(jìn)程就返回。3實驗步驟(1)畫出該實驗流程圖該實驗流程圖如圖所示。圖
2、 實驗7.1流程圖(2)實驗源代碼(multi_proc.c)先看一下下面的代碼,這個程序能得到我們所希望的結(jié)果嗎,它的運行會產(chǎn)生幾個進(jìn)程?請讀者回憶一下fork()調(diào)用的具體過程。答:會產(chǎn)生四個進(jìn)程/* multi_proc_wrong.c */#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <sys/wait.h>int main(void) pid_t child1, child2, child; /*創(chuàng)
3、建兩個子進(jìn)程*/ child1 = fork(); child2 = fork(); /*子進(jìn)程1的出錯處理*/ if (child1 = -1) printf("Child1 fork errorn"); exit(1); else if (child1 = 0) /*在子進(jìn)程1中調(diào)用execlp()函數(shù)*/ printf("In child1: execute 'ls -l'n"); if (execlp("ls", "ls","-l", NULL)<0) printf
4、("Child1 execlp errorn"); if (child2 = -1) /*子進(jìn)程2的出錯處理*/ printf("Child2 fork errorn"); exit(1); else if( child2 = 0 ) /*在子進(jìn)程2中使其暫停5s*/ printf("In child2: sleep for 5 seconds and then exitn"); sleep(5); exit(0); else /*在父進(jìn)程中等待兩個子進(jìn)程的退出*/ printf("In father process:n&q
5、uot;); child = waitpid(child1, NULL, 0); /* 阻塞式等待 */ if (child = child1) printf("Get child1 exit coden"); else printf("Error occured!n"); do child =waitpid(child2, NULL, WNOHANG);/* 非阻塞式等待 */ if (child = 0) printf("The child2 process has not exited!n"); sleep(1); while
6、(child = 0); if (child = child2) printf("Get child2 exit coden"); else printf("Error occured!n"); exit(0);編譯和運行以上代碼,并觀察其運行結(jié)果。它的結(jié)果是我們所希望的嗎?答:不是看完前面的代碼之后,再觀察下面的代碼,它們之間有什么區(qū)別,會解決哪些問題。答:將child2進(jìn)程的產(chǎn)生放在判斷不是child1進(jìn)程的執(zhí)行代碼中,在第一個例子中由于進(jìn)程1在執(zhí)行的時候又fork出一個進(jìn)程,導(dǎo)致產(chǎn)生了第四個進(jìn)程,這個進(jìn)程是child1的子進(jìn)程,它會將ls命令在執(zhí)行
7、一遍,而在第二個例子中由于產(chǎn)生child代碼放在判斷中,故而可以避免在child1中重復(fù)fork新進(jìn)程。/*multi_proc.c */#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <sys/wait.h>int main(void) pid_t child1, child2, child; /*創(chuàng)建兩個子進(jìn)程*/ child1 = fork(); /*子進(jìn)程1的出錯處理*/ if (child1 = -1
8、) printf("Child1 fork errorn"); exit(1); else if (child1 = 0) /*在子進(jìn)程1中調(diào)用execlp()函數(shù)*/ printf("In child1: execute 'ls -l'n"); if (execlp("ls", "ls", "-l", NULL) < 0) printf("Child1 execlp errorn"); else /*在父進(jìn)程中再創(chuàng)建進(jìn)程2,然后等待兩個子進(jìn)程的退出*/
9、 child2 = fork(); if (child2 = -1) /*子進(jìn)程2的出錯處理*/ printf("Child2 fork errorn"); exit(1); else if(child2 = 0) /*在子進(jìn)程2中使其暫停5s*/ printf("In child2: sleep for 5 seconds and then exitn"); sleep(5); exit(0); printf("In father process:n"); child = waitpid(child1, NULL, 0); /* 阻
10、塞式等待 */ if (child = child1) printf("Get child1 exit coden"); else printf("Error occured!n"); do child = waitpid(child2, NULL, WNOHANG ); /* 非阻塞式等待 */ if (child = 0) printf("The child2 process has not exited!n"); sleep(1); while (child = 0); if (child = child2) printf(&q
11、uot;Get child2 exit coden"); else printf("Error occured!n"); exit(0);(3)編譯并運行程序例子1運行結(jié)果:In father process:In child2: sleep for 5 seconds and then exitIn child1: execute 'ls -l'In child1: execute 'ls -l'總用量 12-rwxrwxr-x. 1 chengchangfu chengchangfu 7530 5月 23 16:01 muti_
12、proc-rw-rw-r-. 1 chengchangfu chengchangfu 1756 5月 23 15:59 muti_proc.c總用量 12-rwxrwxr-x. 1 chengchangfu chengchangfu 7530 5月 23 16:01 muti_proc-rw-rw-r-. 1 chengchangfu chengchangfu 1756 5月 23 15:59 muti_proc.cGet child1 exit codeThe child2 process has not exited!The child2 process has not exited!Th
13、e child2 process has not exited!The child2 process has not exited!The child2 process has not exited!Get child2 exit code例子2運行結(jié)果:In father process:In child2: sleep for 5 seconds and then exitIn child1: execute 'ls -l'總用量 28-rwxrwxr-x. 1 chengchangfu chengchangfu 7530 5月 23 16:01 muti_proc-rwx
14、rwxr-x. 1 chengchangfu chengchangfu 7531 5月 23 16:12 muti_proc2-rw-rw-r-. 1 chengchangfu chengchangfu 1845 5月 23 16:11 muti_proc2.c-rw-rw-r-. 1 chengchangfu chengchangfu 1843 5月 23 16:10 muti_proc2.c-rw-rw-r-. 1 chengchangfu chengchangfu 1756 5月 23 15:59 muti_proc.cGet child1 exit codeThe child2 pro
15、cess has not exited!The child2 process has not exited!The child2 process has not exited!The child2 process has not exited!The child2 process has not exited!Get child2 exit code4完成實驗報告實驗總結(jié):答:整個fork函數(shù)可以這樣理解:它復(fù)制當(dāng)前進(jìn)程內(nèi)所有的狀態(tài),并在其復(fù)制處的代碼開始執(zhí)行子進(jìn)程,在例子中child1產(chǎn)生的時候child2還沒有產(chǎn)生,故而在它的進(jìn)程里又重復(fù)fork了child2,從而造成錯誤。5思考問題在目
16、標(biāo)板上運行的結(jié)果如下所示(具體內(nèi)容與各自的系統(tǒng)有關(guān)):因為幾個子進(jìn)程的執(zhí)行有競爭關(guān)系,因此,結(jié)果中的順序是隨機(jī)的。讀者可以思考,怎樣才可以保證子進(jìn)程的執(zhí)行順序呢?答:使用信號同步,wait()與signal()2 編寫守護(hù)進(jìn)程1實驗?zāi)康耐ㄟ^編寫一個完整的守護(hù)進(jìn)程,使讀者掌握守護(hù)進(jìn)程編寫和調(diào)試的方法,并且進(jìn)一步熟悉如何編寫多進(jìn)程程序。2實驗內(nèi)容在該實驗中,讀者首先建立起一個守護(hù)進(jìn)程,然后在該守護(hù)進(jìn)程中新建一個子進(jìn)程,該子進(jìn)程暫停10s,然后自動退出,并由守護(hù)進(jìn)程收集子進(jìn)程退出的消息。在這里,子進(jìn)程和守護(hù)進(jìn)程的退出消息都在系統(tǒng)日志文件(例如“/var/log/messages”,日志文件的全路徑名
17、因版本的不同可能會有所不同)中輸出。子進(jìn)程退出后,守護(hù)進(jìn)程循環(huán)暫停,其間隔時間為10s。3實驗步驟(1)畫出該實驗流程圖。該程序流程圖如圖所示。圖 實驗7.2流程圖(2具體代碼設(shè)置如下:/* daemon_proc.c */#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <sys/wait.h>#include <syslog.h>int main(void) pid_t child1,child2
18、; int i; /*創(chuàng)建子進(jìn)程1*/ child1 = fork(); if (child1 = 1) perror("child1 fork"); exit(1); else if (child1 > 0) exit(0); /* 父進(jìn)程退出*/ /*打開日志服務(wù)*/ openlog("daemon_proc_info", LOG_PID, LOG_DAEMON); /*以下幾步是編寫守護(hù)進(jìn)程的常規(guī)步驟*/ setsid(); chdir("/"); umask(0); for(i = 0; i < getdtable
19、size(); i+) close(i); /*創(chuàng)建子進(jìn)程2*/ child2 = fork(); if (child2 = 1) perror("child2 fork"); exit(1); else if (child2 = 0) /* 進(jìn)程child2 */ /*在日志中寫入字符串*/ syslog(LOG_INFO, " child2 will sleep for 10s "); sleep(10); syslog(LOG_INFO, " child2 is going to exit! "); exit(0); else /* 進(jìn)程child1*/ waitpid(child2, NULL, 0); syslog(LOG_INFO, " child
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 函數(shù)的奇偶性的說課稿
- 上市公司員工購房合同范本
- 轉(zhuǎn)口貿(mào)易合同中運輸條款
- 辦公大樓浮雕施工合同
- 物業(yè)公司財務(wù)內(nèi)控手冊
- 城市公園綠化招投標(biāo)報名表
- 活動攝像租賃簡易合同
- 餐飲KTV音響系統(tǒng)設(shè)備協(xié)議
- 航運服務(wù)招投標(biāo)專用合同條款
- 體育館消防工程合同
- 綜掘機(jī)、綜掘工藝專項安全風(fēng)險辨識評估報告
- 基層工會內(nèi)部控制制度范文五篇
- 馬克思主義基本原理智慧樹知到課后章節(jié)答案2023年下齊魯工業(yè)大學(xué)
- 社會學(xué)課件-階級和階層完整版
- 高中地理地理核心素養(yǎng)與深度教學(xué)課件
- 蘇教版譯林初中英語詞匯表(七年級至九年級)
- 學(xué)而思小學(xué)奧數(shù)知識體系
- 幾丁聚糖資料
- 2016年軟考中級系統(tǒng)集成項目管理工程師下午《應(yīng)用技術(shù)》真題及答案
- 重癥病人水電解質(zhì)和酸堿平衡課件
- 2023年山西王家大院導(dǎo)游詞講解(5篇)
評論
0/150
提交評論