分类: LINUX
2010-07-09 11:22:36
阻塞与非阻塞
首先创建一个子进程,接着让其等待5秒,接下来对父进程应用WAITPID函数等待子进程的退出,父进程每隔1秒判断一次。
源码来自华清远见:
#include
#include
#include
#include
#include
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");
}
}
}
实验结果如下:
非阻塞:
阻塞
注:
从以上实验可以看出两个概念的区别:
阻塞操作是指在没有执行设备操作时,如果没有获得资源,则进程挂起,直到满足可操作的条件再进行操作。非阻塞操作的进程在不能进行设备操作时,并不挂起。