版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個人健康保險合同范本2篇
- 長沙南方職業(yè)學(xué)院《俄語基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度智能倉儲物流設(shè)施建設(shè)合同范本3篇
- 2024物業(yè)權(quán)益讓與擔(dān)保合同 權(quán)益方與受讓方協(xié)議
- 思政教育團(tuán)隊建設(shè)與教師專業(yè)成長
- 二零二五版集成墻板家裝裝修環(huán)保評估合同范本3篇
- 2025年校園歷史文化宣傳欄制作與教育推廣合同3篇
- 二零二五年度建筑設(shè)計創(chuàng)意大賽參賽合同2篇
- 2025年新型農(nóng)業(yè)技術(shù)培訓(xùn)合同范本3篇
- 2025年度定制化鋁材加工與銷售一體化合同4篇
- 獵聘-2024高校畢業(yè)生就業(yè)數(shù)據(jù)報告
- 2024虛擬現(xiàn)實產(chǎn)業(yè)布局白皮書
- 車站值班員(中級)鐵路職業(yè)技能鑒定考試題及答案
- JTG∕T E61-2014 公路路面技術(shù)狀況自動化檢測規(guī)程
- 高中英語短語大全(打印版)
- 軟件研發(fā)安全管理制度
- 三位數(shù)除以兩位數(shù)-豎式運算300題
- 寺院消防安全培訓(xùn)課件
- 比摩阻-管徑-流量計算公式
- GB/T 42430-2023血液、尿液中乙醇、甲醇、正丙醇、丙酮、異丙醇和正丁醇檢驗
- 五年級數(shù)學(xué)應(yīng)用題100道
評論
0/150
提交評論