Linux進程(三)
等待子進程退出
父進程等待子進程退出,並收集子進程的退出狀態
子進程狀態不收集會變成殭屍進程。
等待函數
wait函數
- 如果其所有子進程都還在運行,則阻塞
- 如果一個子進程已終止,正等待父進程獲取其終止狀態,取得該子進程的終止狀態立即返回
- 如果它沒有任何子進程,則立即出錯返回
代碼案例
int cnt = 0;
int status = 10;
pid = fork();
if(pid>0)
{
wait(&status); //把退出狀態存放到status裏面
printf("child quit ,child status = %d\n",WEXITSTATUS(status)); //利用宏來解析出狀態值
while(1)
{
printf("cnt=%d\n",cnt);
printf("this is father print,pid=%d\n",getpid());
sleep(1);
}
}
else if(pid==0)
{
while(1)
{
printf("this is child print,pid=%d\n",getpid());
sleep(1);
cnt++;
if(cnt==3)
{
exit(3);
}
}
}
return 0;
部分參數解析:
status參數:是一個整型數指針
非空:
子進程退出狀態放在它所指向的地址中
空:
不關心狀態
waitpid函數
第一個參數是fork的返回值,前面講到fork返回值在父進程中返回的是子進程的id
第三個參數常用:WNOHANG不阻塞
孤兒進程
1.父進程如果不等待子進程退出,在子進程結束之前就結束了,此時的子進程叫做孤兒進程
2.Linux避免系統存在過多孤兒進程,init進程會收留孤兒進程,變成孤兒進程的父進程