1 /*
2 ##waitpid()函数 头文件:#include<sys/types.h> #include<wait.h>
3 ##原型:pid_t waitpid(pid_t pid,int * status,int options);
4 pid: <-1时,回收指定进程组内的任意子进程;
5 =-1时,回收任意子进程;
6 =0时,回收当前调用waitpid一个组的所有子进程;
7 >0时,回收指定PID的子进程
8 options:WNOHANG,使用这个参数如果没有子进程可回收则返回0,若所有子进程都已收回后在waitpid则返回-1
9 WUNTRACED,使用这个参数可以追踪调试进程
10 0,阻塞状态,相当与wait(NULL)
11
12 status:与wait()一样
13
14 ##waitpid()调用成功返回子进程的PID,失败返回-1,同wait
15 ##返回0值:参数3为WNOHANG,并且子进程尚未结束
16 */
17 #include<stdio.h>
18 #include<unistd.h>
19 #include<wait.h>
20 void main(void)
21 {
22 //连续创建3个子进程
23 int n=3,i;
24 pid_t pid,wpid,j;
25 for(i=0;i<n;i++){//父进程出口
26 sleep(1);
27 pid=fork();
28 if(pid == 0 ){
29 break;//子进程出口
30 }
31 if(i==1){//取出第二个子进程的pid
32 wpid=pid;
33 }
34 }
35 if(pid>0){
36 sleep(2);
37 //waitpid使用,
38 // waitpid(0,NULL,0);//阻塞状态,回收当前组pid的所有子进程中的一个
39 // waitpid(0,NULL,WNOHANG);//非阻塞状态,回收当前组中的一个
40 // waitpid(-1,NULL,0);//阻塞状态,回收任意子进程中的一个
41 // waitpid(-1,NULL,WNOHANG);//阻塞状态,回收任意子进程中的一个
42 // waitpid(wpid,NULL,0);//阻塞状态,回收wpid这个子进程
43 // waitpid(wpid,NULL,WNOHANG);//非阻塞状态,回收wpid这个子进程
44 // waitpid(<-1,NULL,0|WNOHANG);//回收一个进程组(-number)内的所有进程
45 do{
46 j=waitpid(0,NULL,WNOHANG);//非阻塞状态,回收组中的一个子进程
47 }while(j!=-1);//do waitpid 直到收回所有子进程
48 while(1){
49 printf("i am parent pid=%d gpid=%d\n",getpid(),getgid());
50 }
51 }
52 else if(pid == 0){
53 printf("i am TH%d child mypid=%d gpid=%d\n",i,getpid(),getgid());
54 }
55 }
linux系统进程 回收多个子进程——waitpid
最新推荐文章于 2024-07-31 23:02:19 发布