叉,execlp和杀死。僵尸进程

时间:2017-05-26 06:44:03

标签: linux fork kill zombie-process

我有一个用fork和execlp执行另一个进程(bash脚本)的c程序。当我想杀死这个过程时,它会移动到僵尸状态。这是为什么?

创建流程:

    switch (PID_BackUp= fork())
    {
      case -1:
          perror("fork");
          printf("An error has occurred launching backup.sh script!\n");
          break;

      case 0:
          execlp("/usr/local/bin/backup.sh", "/usr/local/bin/backup.sh", NULL, NULL, NULL);
          break;

      default:
          printf("backup.sh script launched correctly! PID: %d\n", PID_BackUp);
          break;
    }

杀死一个过程:

    if(kill(PID_BackUp,SIGKILL)==-1)
        fprintf(stderr, "No se ha podido matar el programa: %d\n", PID_BackUp);
    else
        printf("\nProceso con identificador %d, se ha abortado\n", PID_BackUp);

所以此时此过程将进入僵尸状态。我做错了什么?

1 个答案:

答案 0 :(得分:4)

您应该拨打waitpid(2)或其他等待系统电话(wait4(2) ...)以避免zombie processes。顺便说一下,您还可以处理{Child}进程终止(或更改状态)时要通知的SIGCHLD信号。

通常情况下,您最好kill(2)使用SIGTERM进行signal(7)进程(之后只有SIGKILL),因为该进程 - 您的backup.sh脚本 - 可以正确处理(在shell脚本中使用内置trap)信号(但SIGKILL无法捕获,备份可能会在磁盘上留下杂乱或无用的文件)。另见signal-safety(7)& Advanced Linux Programming

阅读perror(3)(我们无法通过几个段落的几个章节解释这本免费提供的书籍。)

BTW,当系统调用失败时,最好在消息中使用linkstrerror(errno)