叉,execlp和杀。僵尸进程

问题描述:

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

创建过程:

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); 

所以在这一点上,转移至僵死状态。我做错了什么?

您应该致电waitpid(2)或其他等待系统调用(wait4(2) ...)以避免有zombie processes。顺便说一句,你也可以处理SIGCHLD信号,以便在子进程终止(或更改状态)时通知。

一般来说,你最好先用kill(2)SIGTERM(只是后来,随着SIGKILL),因为这个过程 - 你backup.sh脚本 - 可以正确处理(使用trap内置在shell脚本)的信号(但SIGKILL进程不能被抓到,备份可能会在磁盘上留下混乱或无用的文件)。另请参见signal(7) & signal-safety(7)

阅读Advanced Linux Programming(我们无法解释什么是由免费提供书籍给几个章节中只有几个段落)。

顺便说一下,在系统调用失败时,在消息中更好地使用perror(3)strerror(errno)

+0

那么,使用fork的进程应该等待(waitpid)的子进程?我在我的通用程序(嵌入式平台)中使用fork,所以我不能等待子进程(我将不得不创建特定的线程) –

+0

是的,在某些时候,您应该“等待”或“waitpid”。但是,阅读更多关于'SIGCHLD'的信息 –