下載本文檔
版權(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)程會同步運行,但父子進(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)程間是獨立的,其各自的操作不會對對方的值有影響。將上述代碼最終的兩行代碼替換為解釋掉的_exit(0)行,重新編譯,查看結(jié)果,解釋原因:
[root@localhostroot]#./testthetestcontent!forktest!
global=23test=1Child,myPIDis2771
父進(jìn)程的信息沒有打印出來,其原因是:_exit()函數(shù)直接使進(jì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();編譯后運行結(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)程運行時,在其基礎(chǔ)之上再加2,得到上述運行結(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);
編譯運行后結(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編譯運行后結(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三年級英語暑假特色作業(yè)
- 互聯(lián)網(wǎng)數(shù)據(jù)接入采集系統(tǒng)建設(shè)方案
- 智慧工地施工方案1
- 網(wǎng)球俱樂部合同(2篇)
- 南京工業(yè)大學(xué)浦江學(xué)院《食品基礎(chǔ)實驗》2023-2024學(xué)年第一學(xué)期期末試卷
- 鵝媽媽買鞋的說課稿
- 翔荷雅苑2-樓施工組織設(shè)計
- 南京工業(yè)大學(xué)浦江學(xué)院《結(jié)構(gòu)力學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 《小小的船》的說課稿
- 中學(xué)語文教學(xué)反思1
- 2024-2025學(xué)年上海市普陀區(qū)八年級(上)期中數(shù)學(xué)試卷
- 假期補課協(xié)議書
- GB/T 22838.6-2024卷煙和濾棒物理性能的測定第6部分:硬度
- 期中 (試題) -2024-2025學(xué)年譯林版(三起)英語四年級上冊
- 鐵路交通安全主題班會課件
- 道路水穩(wěn)層施工方案(完整版)
- 5、火災(zāi)事故桌面演練記錄表
- 行政法對憲法實施的作用探討
- BIM等信息技術(shù)的使用
- 檁條規(guī)格選用表
- 論大學(xué)的學(xué)術(shù)生態(tài)環(huán)境建設(shè)
評論
0/150
提交評論