1.waitpid()函数
函数原型(常用):pid_t waitpid(pid_t pid,int *status,int options);
参数:
pid
从参数的名字pid和类型pid_t中就可以看出,这里需要的是一个进程ID。但当pid取不同的值时,在这里有不同的意义。
(1)pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了, 只要指定的子进程还没有结束,waitpid就会一直等下去。
(2)pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
(3)pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid 不会对它做任何理睬。
(4)pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。
options
options提供了一些额外的选项来控制waitpid,目前在Linux中WNOHANG最常用
2.使用waitpid()函数将造成子进程成为僵尸进程
示例代码:
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
int cnt = 0;
int status = 10;
pid = fork();
if(pid > 0) //父进程
{
// wait(&status);
waitpid(pid,&status,WNOHANG);//pid为子进程的,WNOHAN不挂起方式
printf("child quit,child status = %d\n",WEXITSTATUS(status));
while(1)
{
printf("this is father print pid=%d\n",getpid());
sleep(2);
printf("cnt = %d\n",cnt);
}
}
else if(pid == 0)//子进程
{
while(1)
{
printf("this is child print pid=%d\n",getpid());
sleep(2);
++cnt;
if(cnt == 3)
{
exit(0);
}
}
}
return 0;
}
运行结果:
2.孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
示例代码:
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
int cnt = 0;
int status = 10;
pid = fork();
if(pid > 0) //父进程
{
printf("this is father print pid=%d\n",getpid());
}
else if(pid == 0)//子进程
{
while(1)
{
printf("this is child print pid=%d,my father pid=%d\n",getpid(),getppid());//getppid()获取父进程pid
sleep(2);
++cnt;
if(cnt == 3)
{
exit(0);
}
}
}
return 0;
}
运行结果: