zoukankan      html  css  js  c++  java
  • 防止僵尸进程的三种方法

    僵尸进程:

     

    第一种,在父进程中通过调用waitpid;

    第二种,在父进程中将子进程结束时产生SIGCHLD信号忽略;

    第三种,在子进程中再次创建孙子进程,然后子进程退出,孙进程被init进程收养,它退出后,init进程将其回收,但子进程还得自己回收。

     

    第一种

       1:  /*
       2:   * =====================================================================================
       3:   *
       4:   *       Filename:  p15.c
       5:   *
       6:   *    Description:  
       7:   *
       8:   *        Version:  1.0
       9:   *        Created:  03/16/2013 01:19:15 PM
      10:   *       Revision:  none
      11:   *       Compiler:  gcc
      12:   *
      13:   *         Author:  YOUR NAME (), 
      14:   *        Company:  
      15:   *
      16:   * =====================================================================================
      17:   */
      18:  #include <stdio.h>
      19:  #include <signal.h>
      20:  #include <unistd.h>
      21:  #include <stdlib.h>
      22:   
      23:  pid_t pid;
      24:   
      25:  void handler(int arg)
      26:  {
      27:     waitpid(pid, NULL, 0); 
      28:  }
      29:   
      30:   
      31:  int main(void)
      32:  {
      33:      signal(SIGCHLD, handler);
      34:   
      35:      if((pid = fork()) < 0)
      36:      {
      37:          perror("fail to fork");
      38:          exit(-1);
      39:      }
      40:   
      41:      if(pid == 0)
      42:      {
      43:          printf("child close\n");
      44:          exit(0);
      45:      }
      46:      else
      47:      {
      48:          while(1);
      49:      }
      50:      
      51:  }

     

    第二种:

       1:  /*
       2:   * =====================================================================================
       3:   *
       4:   *       Filename:  p15.c
       5:   *
       6:   *    Description:  
       7:   *
       8:   *        Version:  1.0
       9:   *        Created:  03/16/2013 01:19:15 PM
      10:   *       Revision:  none
      11:   *       Compiler:  gcc
      12:   *
      13:   *         Author:  YOUR NAME (), 
      14:   *        Company:  
      15:   *
      16:   * =====================================================================================
      17:   */
      18:  #include <stdio.h>
      19:  #include <signal.h>
      20:  #include <unistd.h>
      21:  #include <stdlib.h>
      22:   
      23:  pid_t pid;
      24:   
      25:   
      26:  int main(void)
      27:  {
      28:      signal(SIGCHLD, SIG_IGN);
      29:   
      30:      if((pid = fork()) < 0)
      31:      {
      32:          perror("fail to fork");
      33:          exit(-1);
      34:      }
      35:   
      36:      if(pid == 0)
      37:      {
      38:          printf("child close\n");
      39:          exit(0);
      40:      }
      41:      else
      42:      {
      43:          while(1);
      44:      }
      45:      
      46:  }

     

    第三种

       1:  /*
       2:   * =====================================================================================
       3:   *
       4:   *       Filename:  p15.c
       5:   *
       6:   *    Description:  
       7:   *
       8:   *        Version:  1.0
       9:   *        Created:  03/16/2013 01:19:15 PM
      10:   *       Revision:  none
      11:   *       Compiler:  gcc
      12:   *
      13:   *         Author:  YOUR NAME (), 
      14:   *        Company:  
      15:   *
      16:   * =====================================================================================
      17:   */
      18:  #include <stdio.h>
      19:  #include <signal.h>
      20:  #include <unistd.h>
      21:  #include <stdlib.h>
      22:   
      23:  pid_t pid;
      24:   
      25:   
      26:  int main(void)
      27:  {
      28:      signal(SIGCHLD, SIG_IGN);
      29:   
      30:      if((pid = fork()) < 0)
      31:      {
      32:          perror("fail to fork");
      33:          exit(-1);
      34:      }
      35:   
      36:      if(pid == 0)
      37:      {
      38:         if(fork() == 0)
      39:         {
      40:             printf("grandchild closed");
      41:             exit(0);
      42:         }
      43:          printf("child close\n");
      44:          exit(0);
      45:      }
      46:      else
      47:      {
      48:          while(1);
      49:      }
      50:      
      51:  }
  • 相关阅读:
    [转载]项目风险管理七种武器之引言
    [转载]基于TFS实践敏捷-Scrum模式运用
    [转载]基于TFS实践敏捷-工作项跟踪
    [转载]TFS入门指南
    SVN — subclipse操作指引
    Java 中 方法名或类名 变更 同时 更新 所有引用的 类名或方法名 的解决方案
    Java import javax.servlet 出错
    java 中 SVN 设置所有文件及子目录 needs-lock, svn 提交时自动设置 needs-lock, 及版本不一致问题
    vmware 传输(vmdb)错误-32:pipe:read failed 解决方法
    Web.xml配置详解
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/2963326.html
Copyright © 2011-2022 走看看