避免产生僵死进程

Unix进程控制之4---避免产生僵死进程

分类: C/C++ Linux   165人阅读  评论(0)  收藏  举报

僵死进程是该进程已经死亡,但没有释放系统资源,包括内存和一些一些系统表等,如果这样的进程很多,会引发系统问题。如果我们写一个进程,这个进程fork 了一个新的子进程。而,我们不想等待这个进程完全结束,不想在主程序结束时,这个子进程变成僵死进程。利用两次调用 fork 可以达到这一目标。

下面为一个例子,及解释:

[cpp]  view plain copy
  1. #include<stdio.h>  
  2. #include<sys/wait.h>  
  3. int main(int argc, char **argv[])  
  4. {  
  5.     pid_t pid;  
  6.     printf("Main pid is %d./n",getpid());  
  7.     pid = fork();/*第一个子进程,用来产生第二个子进程,提前与第二个子进程退出*/  
  8.     if(pid < 0)  
  9.     {  
  10.         printf("fork error/n");  
  11.         exit(1);  
  12.     }  
  13.     else if(pid == 0 )/*第一个子进程中执行*/  
  14.     {  
  15.         printf("child pid is %d,and my ppid is %d./n",getpid(),getppid());  
  16.         pid = fork();/*产生第二个子进程,作为最终的目标进程*/  
  17.         if(pid < 0)  
  18.         {  
  19.             printf("fork error/n");  
  20.             exit(1);  
  21.         }  
  22.         else if(pid > 0)/*在第一个子进程退出*/  
  23.         {  
  24.             printf("child pid is %d,and my ppid is %d,i will die./n",getpid(),getppid());  
  25.             exit(0);  
  26.         }  
  27.         sleep(2);/*第二个子进程休眠2秒,等待其父进程结束后,第二个子进程成为init进程的子进程,避免第二个成为僵死进程*/  
  28.         printf("second child,my pid is %d, parent pid = %d/n", getpid(),getppid());  
  29.         exit(0);  
  30.     }  
  31.     /*在主进程中执行,等待第一个子进程结束,避免第一个进程成为僵死进程*/  
  32.     if (waitpid(pid, NULL, 0) != pid)  
  33.     {  
  34.         printf("waitpid error/n");  
  35.         exit(1);  
  36.     }  
  37.       
  38.     printf("My pid is %d,i have waitted %d died./n",getpid(),pid);  
  39.       
  40.     return 0;  
  41. }  

 Ubuntu10.4上的结果:

Main pid is 2736.

child pid is 2737,and my ppid is 2736.

child pid is 2737,and my ppid is 2736,i will die.

My pid is 2736,i have waitted 2737 died.

second child,my pid is 2738, parent pid = 1

总结:

在程序中,主程序中等待了第一个子进程结束,使第一个子进程不会产生僵死。在第一个子进程中,产生第二个子进程。第二个子进程休眠 2秒,等待其父进程(第一个子进程)结束。这是第二个子进程由于在退出前,其父进程提前结束,其父进程变为init。避免产生僵死。为最终需要的目标进程。

在设计中,如果需要一个进程运行时间很长,并且避免产生僵死,则可以在第二个子进程中执行需要的指令。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值