我有一个用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);
所以此时此过程将进入僵尸状态。我做错了什么?
答案 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,当系统调用失败时,最好在消息中使用link或strerror(errno)
。