叉,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)
。
那么,使用fork的进程应该等待(waitpid)的子进程?我在我的通用程序(嵌入式平台)中使用fork,所以我不能等待子进程(我将不得不创建特定的线程) –
是的,在某些时候,您应该“等待”或“waitpid”。但是,阅读更多关于'SIGCHLD'的信息 –