Linux进程的阻塞与非阻塞


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

  }

  }

  }

  注:

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

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


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3