上学吧原文连接,请点击谢谢: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;
}