关于wait(),waitpid()等待子进程的理解

来源:互联网 发布:快速选择算法思想 编辑:程序博客网 时间:2024/04/29 16:20

上学吧原文连接,请点击谢谢:http://www.shangxueba.com/jingyan/1868777.html

我们经常会遇到去使用wait(),waitpid()去回收子进程的资源,获取子进程的退出状态。

  在waitpid中等待的时候会使用pid来指定范围,对pid指定范围中的子进程的理解,好多人都没理解好,一下是个人的一点实验心得。

  1、pid四种取值中 >0 等待pid指定的子进程,这个不存在争议。但是==-1等待任一子进程的时候,考虑一个问题,子进程创建子进程了。那么这个子进程创建的子进程是不是算作-1的等待范围呢。这个不算的。

  2、如果等待的市进程组呢。还是那个问题,这个子进程创建的子进程是不是算作  -pid的等待范围呢。这个也不是,还是那个问题,我们等待的是父进程直接创建的子进程。

  总结:

  从验证来看的话,wait的等待的子进程只能是有一种,就是调用wait或者waitpid的进程直接创建的进程我们才能称之为子进程。所以,这个要注意一下。

  验证代码如下,可以通过调整每个进程的sleep时间来获取不同等待范围下waitpid的返回值来确定waitpid的等待范围,进而分析出子进程的子进程在不在这个范围之内:

  /* ************************************************************************

  *       Filename:  fork.c

  *    Description:

  *        Version:  1.0

  *        Created:  2014年07月14日 23时00分22秒

  *       Revision:  none

  *       Compiler:  gcc

  *         Author:  YOUR NAME (),

  *        Company:

  * ************************************************************************/

  #include

  #include

  #include

  #include

  int main(int argc, char *argv[])

  {

  pid_t pid = fork();

  if(pid == 0)

  {

  pid_t pid = fork();

  if(pid == 0)

  {

  sleep(1);//可以修改这个时间让这个子进程的子进程先返回,看waitpid的返回值

  printf("3333333\n");

  printf("333333getpgid=%d\n",getpgid(getpid()));

  return 3;

  }

  else if(pid >0)

  {

  sleep(5);//这个时间一定要比子进程等待时间长

  printf("22222getpgid=%d\n",getpgid(getpid()));

  printf("22222222\n");

  return 2;

  }

  }

  else if(pid >0)

  {

  pid_t pidx = fork();

  if(pidx == 0)

  {

  sleep(3);//这个来验证等待任意一个子进程的。

  printf("44444\n");

  printf("4444444getpgid=%d\n",getpgid(getpid()));

  return 4;

  }

  int status = 0;

  sleep(1);

  pid_t pgid =-getpgid(0);

  printf("1111111getpgid=%d\n",pgid);

  waitpid(pgid,&status,0);

  if(WIFEXITED(status)!=0)

  {

  printf("return value =%d\n",WEXITSTATUS(status));

  }

  printf("1111111\n");

  }

  return 0;

  }

0 0
原创粉丝点击