版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第C語言控制進程之進程等待詳解目錄進程等待的必要進程等待的方法wait函數(shù)waitpid函數(shù)獲取子進程退出信息
進程等待的必要
當(dāng)一個進程終止的時候,它的資源,比如說PCB,數(shù)據(jù)等不會被立馬清理掉。它會保持在已經(jīng)終止的狀態(tài),這種狀態(tài)稱為僵尸狀態(tài),直到被父進程確認(rèn)。父進程wait,即父進程向內(nèi)核確認(rèn)子進程已經(jīng)終止,可以為子進程收尸了,內(nèi)核會把子進程的退出信息傳給父進程,然后清理掉子進程的資源,這個時候子進程才算真正地終止了!
總結(jié):
父進程等待,可以獲取子進程的退出信息,知道子進程的執(zhí)行結(jié)果。父進程等待,可以釋放子進程的資源,讓子進程真正地退出,避免一直消耗系統(tǒng)的存儲資源,造成內(nèi)存泄露等危害。父進程等待,可以保證時序的問題,子進程先于父進程退出,避免讓子進程變?yōu)楣聝哼M程。
進程等待的方法
wait函數(shù)
一個進程可以通過調(diào)用wait函數(shù)等待子進程。wait函數(shù)是系統(tǒng)調(diào)用函數(shù)。
#includesys/types.h
#includesys/wait.h
pid_twait(int*status);
返回值:返回被等待進程的pid,如果等待失敗,返回-1。
參數(shù):輸出型參數(shù),可以獲取子進程的退出狀態(tài),如果不需要獲取子進程的退出狀態(tài),則設(shè)置為NULL。
測試:
#includestdio.h
#includeunistd.h
#includesys/types.h
#includesys/wait.h
#includestdlib.h
intmain(void)
pid_tid=fork();//創(chuàng)建子進程
if(id==0)
//child
//執(zhí)行5秒
intcnt=5;
while(cnt)
printf("child[%d],cnt:%d\n",getpid(),cnt);
sleep(1);
cnt--;
exit(EXIT_SUCCESS);
sleep(10);
pid_tret=wait(NULL);
if(ret0)
//waitsuccess,retispid;
printf("fatherwaitchild[%d]success\n",ret);
else{
//waitfailed.
printf("fatherwaitfailed\n");
return0;
}
現(xiàn)象:子進程執(zhí)行5秒后,終止了,但是內(nèi)核沒有立馬清理掉它的資源,所以此時是僵尸狀態(tài),再過了5秒之后,父進程休眠完畢,然后等待子進程,確認(rèn)子進程已經(jīng)終止,返回子進程的pid,然后內(nèi)核開始清理子進程資源,子進程真正地終止了,又過了5秒后父進程也終止了。
通過wait函數(shù)的輸出型參數(shù)可以獲得子進程的退出信息。
waitpid函數(shù)
waitpid函數(shù)也可以使得父進程等待子進程
#includesys/types.h
#includesys/wait.h
pid_twaitpid(pid_tpid,int*status,intoptions);
先不關(guān)心第二個和第三個參數(shù),第二個參數(shù)可以設(shè)置為NULL,第三個參數(shù)暫時設(shè)置為0。
第一個參數(shù):
1、如果第一個參數(shù)pid傳的是某個具體的進程的進程ID,表示等待該指定進程
2、如果第一個參數(shù)pid傳的是-1,表示等待父進程的任意子進程。
第三個參數(shù):
傳的是0,表示父進程是掛起等待子進程的(阻塞等待)??梢岳斫鉃楦高M程在等待子進程的過程中,什么事情也沒做,在干等。傳的是宏WNOHANG,表示父進程是非阻塞等待。若等待的子進程還沒有終止,那么waitpid函數(shù)立即返回0,不予以等待。若等待的子進程已經(jīng)正常結(jié)束,那么waitpid函數(shù)返回等待子進程的PID
wait(status)等價于waitpid(-1,status,0)
【注意事項】
如果子進程已經(jīng)退出,調(diào)用wait/waitpid時,wait/waitpid會立即返回,獲得子進程退出信息,并且釋放被等待子進程資源。如果在任意時刻調(diào)用wait/waitpid,子進程存在且還在正常運行,則父進程可能會發(fā)生阻塞。如果試圖等待一個當(dāng)前不存在的進程,wait/waitpid會調(diào)用出錯,并立即返回。
獲取子進程退出信息
在上述并沒有具體解釋參數(shù)status的作用。
在wait和waitpid函數(shù)中,status的作用是一樣的,它是輸出型參數(shù)。如果給status傳的是NULL,則表示不需要獲取子進程的退出信息。如果給status傳的是非NULL,則可以獲取被等待進程的退出信息。
status是一個指向整形的指針。但是一個進程的退出信息那么多,怎么可能會那么簡單地用一個整型就知道進程的退出信息了呢?實際上,并不是簡單地看待status指向的整形,而是當(dāng)作位圖來看,一個整型有32位,這樣就可以全面地描述被等待進程的退出信息了。
只用研究低16個比特位。
進程退出的情況有四種:
1、正常退出(自愿,代碼執(zhí)行完,結(jié)果正確)
2、錯誤退出(自愿,代碼執(zhí)行完,結(jié)果不正確)
3、異常退出(非自愿,代碼未執(zhí)行完,退出碼無意義)
4、被其他進程終止(非自愿,代碼未執(zhí)行完,退出碼無意義)
這四種情況,可以按照進程是否收到信號來分類,第一種和第二種進程未收到信號,第三和第四種進程收到信號。
當(dāng)被等待進程不是被信號所終止時,低8位全是0,而次低8位則是被等待進程的退出碼。
當(dāng)被等待進程是被信號所終止時,低7位表示被等待進程收到的信號。
如果進程是正常終止,如何顯示地知道退出碼?
如果進程是收到信號而終止,如何知道它收到了什么信號?直接就是低7位表示的是進程收到的信號,如果是非法的信號,說明它沒有收到信號,這個值是無效的。
測試:
#includestdio.h
#includeunistd.h
#includesys/types.h
#includesys/wait.h
#includestdlib.h
intmain(void)
pid_tid=fork();//創(chuàng)建子進程
if(id==0)
//child
//執(zhí)行5秒
intcnt=7;
while(cnt)
printf("child[%d],cnt:%d\n",getpid(),cnt);
sleep(1);
cnt--;
exit(12);
sleep(10);
intstatus;
pid_tret=waitpid(id,status,0);
if(ret0)
//waitsuccess,retispid;
printf("fatherwaitchild[%d]success\n",ret);
else{
//waitfailed.
printf("fatherwaitfailed\n");
printf("getaexitnum:%d\n,getasingle:%d",(status8)0XFFFF,status0XFFFF);
sleep(2);
return0;
}
當(dāng)然,還可以不需要進行位運算,系統(tǒng)提供了兩個宏,可以得到退出信息
WIFEXITED(status):如果被等待進程正常退出則未真。WEXITSTATUS(status):如果WFIEXITED(status)為真,提取被等待進程的退出碼。
#includestdio.h
#includeunistd.h
#includesys/types.h
#includesys/wait.h
#includestdlib.h
intmain(void)
pid_tid=fork();//創(chuàng)建子進程
if(id==0)
//child
//執(zhí)行5秒
printf("iamchildprecess\n");
sleep(5);
exit(12);
sleep(3);
intstatus;
printf("fatherbeginwait\n");
pid_tret=waitpid(id,status,0);
if(ret0)
//waitsuccess,retispid;
printf("fatherwaitchild[%d]success\n",ret);
else{
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026江西省歐潭人力資源集團有限公司招聘見習(xí)生3人筆試參考題庫及答案解析
- 2026上半年貴州事業(yè)單位聯(lián)考赫章縣招聘153人筆試備考試題及答案解析
- 2026年工程地質(zhì)勘察中的質(zhì)量保證措施
- 2026年土地利用中的地質(zhì)災(zāi)害防范策略
- 2025年少先隊提前入隊筆試題及答案
- 2025年廣東廣業(yè)投資集團筆試及答案
- 2026新興際華集團所屬中新聯(lián)公司招聘事業(yè)部總經(jīng)理副總經(jīng)理筆試模擬試題及答案解析
- 2025年材料類事業(yè)單位考試真題及答案
- 2026年臨界含水率對土壤材料的影響
- 2026四川能投綜合能源有限責(zé)任公司員工招聘19人筆試備考試題及答案解析
- 2026年及未來5年中國TFT液晶面板行業(yè)市場發(fā)展數(shù)據(jù)監(jiān)測及投資方向研究報告
- 大唐集團機考行測題庫
- 車輛日常安全檢查課件
- 民航安全法律法規(guī)課件
- 山東省濟寧市2026屆第一學(xué)期高三質(zhì)量檢測期末考試濟寧一模英語(含答案)
- 光伏電站巡檢培訓(xùn)課件
- 中建建筑電氣系統(tǒng)調(diào)試指導(dǎo)手冊
- 年末節(jié)前安全教育培訓(xùn)
- 安全生產(chǎn)麻痹思想僥幸心理
- GB/T 93-2025緊固件彈簧墊圈標(biāo)準(zhǔn)型
- 建設(shè)工程測繪驗線標(biāo)準(zhǔn)報告模板
評論
0/150
提交評論