




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——使用forkexit和exec系統(tǒng)調(diào)用編寫多進(jìn)程程序4.3使用fork、exit和exec系統(tǒng)調(diào)用編寫多進(jìn)程程序
本試驗將通過編寫fork等系統(tǒng)調(diào)用的程序,加深對系統(tǒng)進(jìn)程及其控制的了解。fork后父子進(jìn)程會同步運(yùn)行,但父子進(jìn)程的返回順序是不確定的。設(shè)兩個變量global和test來檢測父子進(jìn)程共享資源的狀況。同時在進(jìn)程退出時對exit和_exit的區(qū)別進(jìn)行測試和說明。
1.fork
#include#include#include#include#include#include//#includeintglobal=22;
charbuf[]=\
intmain(void){
inttest=0,stat;pid_tpid;
if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1)
perror(\printf(\/*fork*/
pid=fork();/*weshouldchecktheerror*/if(pid==-1){
perror(\exit;}
/*ifthepid=0thenitisthechild*/elseif(pid==0){global++;test++;
printf(\exit(0);}
/*elsebetheparent*/global+=2;test+=2;
printf(\exit(0);
//printf(\//_exit(0);}
編譯執(zhí)行,并分析結(jié)果:[root@localhostroot]#./testthetestcontent!forktest!
global=23test=1Child,myPIDis2751global=24test=2Parent,myPIDis2750
可以看出父子進(jìn)程打印出了各自的進(jìn)程號和對應(yīng)變量的值,顯然global和test在父子進(jìn)程間是獨(dú)立的,其各自的操作不會對對方的值有影響。將上述代碼最終的兩行代碼替換為解釋掉的_exit(0)行,重新編譯,查看結(jié)果,解釋原因:
[root@localhostroot]#./testthetestcontent!forktest!
global=23test=1Child,myPIDis2771
父進(jìn)程的信息沒有打印出來,其原因是:_exit()函數(shù)直接使進(jìn)程中止運(yùn)行,清除其使用的內(nèi)存空間,并銷毀其在內(nèi)核中的各種數(shù)據(jù)結(jié)構(gòu);而exit()函數(shù)則在這些基礎(chǔ)上作了一些包裝,在執(zhí)行退出之前加了若干道工序。exit()函數(shù)在調(diào)用exit系統(tǒng)調(diào)用之前要檢查文件的開啟狀況,把文件緩沖區(qū)中的內(nèi)容寫回文件,即會\清理I/O緩沖\。若將上述_exit(0)改為exit(0),則確定會有打印。另外,需要注意換行符\\n會引起IO的清理操作,若下面的語句printf(\Parent,myPIDis%d\加上\\n,則調(diào)用_exit(0)的結(jié)果和調(diào)用exit(0)的結(jié)果是一樣的。
2.vfork的特點
將上述代碼的pid=fork();改為pid=vfork();編譯后運(yùn)行結(jié)果如下:[root@localhostroot]#./testthetestcontent!forktest!
global=23test=1Child,myPIDis2849global=25test=3Parent,myPIDis2848
可以看出,vfork與fork區(qū)別在于共享的資源不一樣,vfork調(diào)用后,子進(jìn)程先對global和test加1,父進(jìn)程運(yùn)行時,在其基礎(chǔ)之上再加2,得到上述運(yùn)行結(jié)果。即vfork的特點是:在調(diào)用execv或者exit前子進(jìn)程對變量的修改會影響到父進(jìn)程,即他們是共享的;
特別注意:父進(jìn)程等待子進(jìn)程調(diào)用execv或exit才繼續(xù)執(zhí)行。則若子進(jìn)程依靠父進(jìn)程的進(jìn)一步動作時,父進(jìn)程又必需阻塞到子進(jìn)程調(diào)用execv或者exit才會往下執(zhí)行,此時就會造成“死鎖〞。讀者可自己設(shè)計測試一下這種“死鎖〞狀態(tài)。
4.4使用fork和exec系統(tǒng)調(diào)用編寫執(zhí)行命令的程序
本試驗將通過編寫fork和exec等系統(tǒng)調(diào)用的程序,加深對系統(tǒng)進(jìn)程及其控制的了解。fork后調(diào)用exec族函數(shù)來調(diào)用系統(tǒng)命令或者程序來實現(xiàn)系統(tǒng)shell功能。
execv函數(shù)族的使用
注意點:調(diào)用execv后,程序不再返回!在上述代碼基礎(chǔ)上,在子進(jìn)程的退出代碼前參與如下代碼:
printf(\if(execl(\
perror(\
printf(\exit(0);
編譯運(yùn)行后結(jié)果為:[root@localhostroot]#./testthetestcontent!forktest!
global=23test=1Child,myPIDis2909
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMANDroot27190.00.643601032pts/1S23:140:00/bin/bashroot29080.00.11340276pts/1R23:380:00./testroot29090.00.42684736pts/1R23:380:00ps-auglobal=25test=3Parent,myPIDis2908
4.waitpid的作用是等待子進(jìn)程退出并回收其資源,同時可以通過WIFEXITED等宏調(diào)用可以檢測子進(jìn)程退出的狀態(tài)。在第一個例如fork使用的代碼基礎(chǔ)上進(jìn)行修改,添加檢測進(jìn)程退出狀態(tài)的子函數(shù),參考代碼如下:
voidexit_check(intstat){if(WIFEXITED(stat))
printf(\elseif(WIFSIGNALED(stat))
printf(\\\n\#ifdefWCOREDUMP/
WCOREDUMP(stat)?\#else\\
#endif//條件編譯,如WIFSIGNALED(stat)為非0,
//且此進(jìn)程產(chǎn)生一個內(nèi)存映射文件(coredump)則返回非0elseif(WIFSTOPPED(stat))//假使子進(jìn)程暫停(stopped)則返回非0printf(\}
在父進(jìn)程處理global和test變量前參與如下代碼:
if(waitpid(pid,//thestatusofexitcheck編譯運(yùn)行后結(jié)果為:[root@localhostroot]#./testthetestcontent!forktest!
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)校校舍使用管理制度
- 家具現(xiàn)場施工管理制度
- 學(xué)校讀物借閱管理制度
- 小區(qū)物業(yè)公司管理制度
- 大廈電梯門禁管理制度
- 幼師上課紀(jì)律管理制度
- 醫(yī)院物業(yè)協(xié)助管理制度
- 醫(yī)院網(wǎng)絡(luò)結(jié)算管理制度
- 關(guān)于環(huán)衛(wèi)車輛管理制度
- 客戶服務(wù)投訴管理制度
- 雇人包工免責(zé)協(xié)議書
- 船舶應(yīng)急部署表及船員應(yīng)變卡
- 2025年下半年山東能源集團(tuán)權(quán)屬企業(yè)內(nèi)蒙古榮信化工限公司社會招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 2025屆高三5月份全國各地聯(lián)考文言文閱讀分類匯編(解析版)
- 土建項目分包協(xié)議書
- 陜西郵政校招筆試題及答案
- 吐魯番市高昌區(qū)招聘社區(qū)工作者考試真題2024
- 山東省濟(jì)南市2025屆高三三模歷史試卷(含答案)
- 小學(xué)語文大單元整體教學(xué)設(shè)計講座
- 2025年中考道法答題技巧與模板構(gòu)建專題08主觀題答題技巧(觀點概括類試)(學(xué)生版+解析)
- 風(fēng)力發(fā)電場調(diào)試規(guī)程
評論
0/150
提交評論