【Linux】进程等待

目录

进程等待的必要性:

进程等待的方法:

wait方法(测试):

waitpid方法(测试): 

完整的等待过程:

进程的阻塞/非阻塞等待: 

 非阻塞等待的相关代码:

进程等待的必要性:

1:回收僵尸,解决内存泄露

2:需要获取子进程的运行状态

3:尽量父进程要晚于子进程退出,可以规范化进行资源回收

进程等待的方法:

wait方法(测试):

 #include<stdio.h>
    2 #include<sys/types.h>
    3 #include<sys/wait.h>
    4 #include<unistd.h>
    5 int main()
    6 {
    7   pid_t id = fork();
    8   if(id < 0)
    9   {
   10     perror("fork");
   11     return 1;
   12   }
   13   else if(id ==0)
   14   {
   15     int count = 5;
   16     while(count)
   17     {
   18       printf("child is running:%d,ppid:%d,pid:%d\n",count--,getppid(),getpid());
   19       sleep(1);
   20     }
   21     printf("child quit...\n");
E> 22     exit(0);
   23   }
   24   else
   25   {
   26     printf("father is waiting...\n");                                                                                                                     
   27     pid_t ret = wait(NULL);
   28     printf("father is wait done,ret:%d\n",ret);
   29   }
   30   return 0;
   31 }

waitpid方法(测试): 

int main()
    6 {
    7   pid_t id = fork();
    8   if(id == 0)
    9   {
   10     int count = 5;
   11     while(count)
   12     {
   13       printf("child is running:%d,ppid:%d,pid:%d\n",count--,getppid(),getpid());
   14       sleep(1);
   15     }
   16     printf("child quit ...\n");
E> 17     exit(0);
   18   }
   19   sleep(8);
   20   //father
   21   pid_t ret = waitpid(id,NULL,0);
   22   printf("father wait done,ret:%d\n",ret);
   23   sleep(3);                                                                                                                                               
   24 }

完整的等待过程:

int main()
    6 {
    7   pid_t id = fork();
    8   if(id == 0)
    9   {
   10     int count = 5;
   11     while(count)
   12     {
   13       printf("child is running:%d,ppid:%d,pid:%d\n",count--,getppid(),getpid());
   14       sleep(1);
   15     }
   16     printf("child quit ...\n");
E> 17     exit(10);
   18   }
   19   int status = 0;
   20   pid_t ret = waitpid(id,&status,0);
   21   if(ret > 0)
   22   {
   23     printf("wait succes!\n");
   24     if((status & 0x7F) ==0)
   25     {
   26       printf("process quit normal!\n");
   27       printf("exit code : %d\n",(status >> 8)&0xFF);
   28     }
   29     else{
   30       printf("process quit error!\n");
   31       printf("sig:%d\n",status&0x7F);                                                                                                                     
   32     }
   33   }
   34 }

错误测试:

 系统提供了一堆的宏,可以用来判断退出码,退出状态

 if(ret > 0)
   22   {
   23     printf("wait success!\n");
   24     if(WIFEXITED(status))
   25     {
   26       printf("normal quit!\n");
   27       printf("quit code:%d\n",WEXITSTATUS(status));                                                                                                       
   28     }
   29     else
   30     {
   31       printf("process quit error!\n");
   32     }
}

进程的阻塞/非阻塞等待: 

目前我们所调用的函数,都是阻塞函数

如何理解阻塞等待:父进程在等(将当前进程放入等待队列,并将进程状态设置为非R状态),子进程在跑

 

 非阻塞等待的相关代码:

int main()
    6 {
    7   pid_t id = fork();
    8   if(id == 0)
    9   {
   10     int count = 5;
   11     while(count)
   12     {
   13       printf("child is running:%d,ppid:%d,pid:%d\n",count--,getppid(),getpid());
   14       sleep(1);
   15     }
   16     printf("child quit ...\n");
E> 17     exit(10);
   18   }
   19   int status = 0;
   20   while(1)
   21   {
   22     pid_t ret = waitpid(id,&status,WNOHANG);
   23     if(ret == 0)
   24     {
   25       printf("wait next !\n");
   26       printf("father do other thing!\n");
   27     }
   28     else if(ret > 0)
   29     {
   30       printf("wait succes,ret:%d,code:%d\n",ret,WEXITSTATUS(status));
   31       break;
   32     }
   33     else{
   34       printf("wait failed!\n");
   35       break;
   36     }
   37   }
   38 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值