Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 叉、拔、杀。僵尸进程_Linux_Fork_Kill_Zombie Process - Fatal编程技术网

Linux 叉、拔、杀。僵尸进程

Linux 叉、拔、杀。僵尸进程,linux,fork,kill,zombie-process,Linux,Fork,Kill,Zombie Process,我有一个c程序,它使用fork和execlp执行另一个进程(bash脚本)。当我想杀死这个进程时,它会变成僵尸状态。这是为什么 创建一个流程: switch (PID_BackUp= fork()) { case -1: perror("fork"); printf("An error has occurred launching backup.sh script!\n"); break; ca

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

创建一个流程:

    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);
终止进程:

    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);
因此,在这一点上,进程将进入僵尸状态。我做错了什么?

您应该打电话或其他等待系统呼叫(…),以避免出现问题。顺便说一句,您还可以处理子进程终止(或更改状态)时要通知的
SIGCHLD
信号

一般来说,您最好先使用
SIGTERM
(以后才使用
SIGKILL
)创建一个进程,因为该进程(您的
backup.sh
脚本)可以正确处理(使用shell脚本中的
trap
内置)信号(但是无法捕获到
SIGKILL
,备份可能会在磁盘上留下杂乱无章或无用的文件)。另请参阅&

阅读(我们无法在几章几段中解释那本免费提供的书所教授的内容)

顺便说一句,当系统调用失败时,最好在消息中使用或
strerror(errno)

您应该调用或其他等待的系统调用(…)以避免出现错误。顺便说一句,您还可以处理子进程终止(或更改状态)时要通知的
SIGCHLD
信号

一般来说,您最好先使用
SIGTERM
(以后才使用
SIGKILL
)创建一个进程,因为该进程(您的
backup.sh
脚本)可以正确处理(使用shell脚本中的
trap
内置)信号(但是无法捕获到
SIGKILL
,备份可能会在磁盘上留下杂乱无章或无用的文件)。另请参阅&

阅读(我们无法在几章几段中解释那本免费提供的书所教授的内容)


顺便说一句,当系统调用失败时,最好在消息中使用或
strerror(errno)

那么,使用fork的进程是否应该等待子进程(waitpid)?我在我的通用程序(嵌入式平台)中使用fork,所以我不能等待子进程(我必须创建一个特定的线程)是的,在某些时候你应该
wait
waitpid
。但是,请阅读更多关于
SIGCHLD
的信息。那么,使用fork的进程是否应该等待(waitpid)子进程呢?我在我的通用程序(嵌入式平台)中使用fork,所以我不能等待子进程(我必须创建一个特定的线程)是的,在某个时候你应该
wait
waitpid
。但是,请阅读更多关于
SIGCHLD