首先創建一個子進程,接著讓其等待5秒,接下來對父進程應用WAITPID函數等待子進程的退出,父進程每隔1秒判斷一次。
源碼來自華清遠見:
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t pc, pr;
//創建子進程
pc = fork();
if(pc < 0)
{
printf("error fork!\n");
}
else if(pc == 0)
{
sleep(5);
exit(0);
}
else
{
do{//循環測試是否子進程退出
pr = waitpid(pc, NULL, WNOHANG);//非阻塞
//pr =waitpid(pc, NULL, 0);//阻塞
if(pr == 0)
{
printf("the child process has not exited!\n");
sleep(1);
}
}while(pr == 0);
if(pr == pc)
{
printf("get child exit code: %d\n", pr);
}
else
{
printf("some error occured.\n");
}
}
}
注:
從以上實驗可以看出兩個概念的區別:
阻塞操作是指在沒有執行設備操作時,如果沒有獲得資源,則進程掛起,直到滿足可操作的條件再進行操作。非阻塞操作的進程在不能進行設備操作時,並不掛起