wait,waitpid学习测试

通过man 2 wait查询wait和waitpid函数,结果如下:


wait和waitpid函数参入调用如下:

pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid,*wstatus,int options);

wait函数功能:父进程一旦调用wait函数就立即阻塞自己,由wait分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回,如果没有找到,就一直阻塞,直至找到一个结束的子进程或接收到了一个指定的信号为止。
waitpid函数功能:waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能等。实际上wait()函数只是waitpid()函数的一个特例。
测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void)
{
	pid_t pid,wpid;
	pid=fork();
	int status;	
	if(pid==0)
	{
		printf("---child,my parent=%d,going to sleep 60s\n",getppid());
		sleep(20);
		printf("--------------child die---------------\n");
		exit(76);
	}else if(pid>0)
	{
		wpid=wait(&status);
		if(wpid==-1)
		{
			perror("wait error:");
			exit(1);
		}
		if(WIFEXITED(status))
		{
			printf("child exit with %d\n",WEXITSTATUS(status));
		}
		if(WIFSIGNALED(status))
		{
			printf("child exit with %d\n",WTERMSIG(status));
		}
		while(1)
		{
			printf("I am parent,pid=%d,myson=%d\n",getpid(),pid);
			sleep(1);
		}
	}
	else
	{
		perror("fork");
		return -1;
	}
	return 0;
}

演示结果:

测试代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int main(int argc,char *argv[])
{
	int n=5,i;
	pid_t p,q;
	pid_t wpid;
	if(argc==2)
	{
		n=atoi(argv[1]);
	}
	for(i=0;i<n;i++)
	{
		p=fork();
		if(p==0)
		{
			break;
		}
	}
	if(n==i)
	{
		sleep(n);
		printf("I am parent,pid=%d,gpid=%d\n",getpid(),getgid());
		do
		{
			wpid=waitpid(-1,NULL,WNOHANG);
			if(wpid>0)
			{
				n--;
			}
			sleep(1);
		}while(n>0);
		printf("wait finish\n");
	}
	else
	{
		sleep(i);
		printf("I am %dth child,pid=%d,gpid=%d\n",i+1,getpid(),getgid());
	}
	return 0;
}

演示结果:

posted @ 2019-11-10 13:37  20199310娄豪  阅读(154)  评论(0)    收藏  举报