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;
}
演示结果: