Linux 叉、拔、杀。僵尸进程
我有一个c程序,它使用fork和execlp执行另一个进程(bash脚本)。当我想杀死这个进程时,它会变成僵尸状态。这是为什么 创建一个流程: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
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