僵死进程、子进程退出的异步善后处理

一、僵死进程:子进程先于父进程执行完毕后,因为子进程的退出码需要保存起来供父进程随后调用wait使用,但子进程的数据结构等占用资源不会立刻被删除,                                      这就是僵死进程。

                              

二、子进程退出的异步善后处理

          (1)了避免僵死进程长期占用资源,父进程可以调用wait 或者waitpid暂时停止执行,等待子进程终止运行后,在继续执行父进程。

          (2)wait函数说明:

                   #include<sys/types.h>

                   #include<sys/wait.h>

                    pid_t  wait(int *stat_loc);

                 返回值:已经结束的子进程Id代表成功,-1代表失败。(提问,如果很多子进程,返回值子进程id,如何确定哪个子进程出现问题?)

                 当父进程调用wait后将被阻塞,直至任何一个子进程退出。可以通过WEXITSTATUS宏获得wait的参数stat_loc指向的返回码。(提问:如何获得?相关代码?)

           (3)waitpid函数调用

                   #include<sys/types.h>

                   #include<sys/wait.h>

                   pid_t waitpid(pid_t pid, int *stat_loc,int options);

                   参数说明:pid代表父进程希望等待的某个子进程。如果为-1,则代表返回任何一个子进程的信息。

                                        *stat_loc  代表退出码

                                        options参数允许修改waitpid的行为,WNOHANG选项表示调用该函数的进程不会挂起,而且继续运行。

             (4)异步善后处理

                            LINUX机制提供信号来实现进程间通,当进程收到SIGCHLD信号,于是父进程可以在处理程序中进行子进程退出后的处理。

                           void  sigchld_handler(int signo);

                         {

                          ......

                               do

                                 {pid =waitpid(-1,&status,WNOHANG);

                                  }while(pid>0);

                          }

                           通过执行waitpid循环,使用WNOHANG选项,当pid<=0时,表示无进程  退出,于是信号处理结束,返回父进程被信号中断的位置处继续处理。   

                  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值