使用forkexit和exec系統(tǒng)調(diào)用編寫多進(jìn)程程序_第1頁
使用forkexit和exec系統(tǒng)調(diào)用編寫多進(jìn)程程序_第2頁
使用forkexit和exec系統(tǒng)調(diào)用編寫多進(jìn)程程序_第3頁
使用forkexit和exec系統(tǒng)調(diào)用編寫多進(jìn)程程序_第4頁
使用forkexit和exec系統(tǒng)調(diào)用編寫多進(jìn)程程序_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論