9.父进程等待子进程退出及waitpid

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;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值