位置:海鸟网 > IT > linux/Unix >

Linux进程的阻塞与非阻塞

  首先创建一个子进程,接着让其等待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: %dn", pr);

  }

  else

  {

  printf("some error occured.n");

  }

  }

  }

  注:

  从以上实验可以看出两个概念的区别:

  阻塞操作是指在没有执行设备操作时,如果没有获得资源,则进程挂起,直到满足可操作的条件再进行操作。非阻塞操作的进程在不能进行设备操作时,并不挂起