我在 C 中有一个函数,可以创建一个子进程并使用
execvp()
来执行某个任务。
pid_t pid = fork();
if (pid == 0) {
if (execvp(cmd->arg_array[0], cmd->arg_array) == -1) {
exit(-1);
return ERROR;
}
} else if (pid < 0)
return ERROR;
//Some more code...
return NO_ERROR;
如您所见,如果任务失败,则应删除包含该任务的进程,并返回带有
ERROR
值的函数。
我尝试使用
exit(-1)
(还有 _exit()
) 实现此功能,但永远不会到达 return 语句,因为代码位于父进程区域中。另外,如果我删除 exit()
并让函数返回错误,该进程将保持存在并干扰程序运行。当execvp
任务失败时,如何在函数返回之前杀死创建的子进程?
包含它的进程应该被删除,并且函数返回
值。ERROR
不,事实并非如此。成功的
fork()
创建一个新进程并将 0
返回给这个新进程。在您的示例中,execvp
在这个新进程中执行,如果失败,您立即执行exit(-1);
,此时进程终止,并且永远不会到达return ERROR;
行。
您可以使用
wait
或 waitpid
来收集子进程在父进程中的退出状态。
示例:
pid_t pid = fork();
if (pid == 0) {
execvp(cmd->arg_array[0], cmd->arg_array);
// there's no need to check the return value from execvp:
// if execvp returns, it means that it failed.
exit(1);
} else if (pid == -1)
return ERROR;
}
// parent
int wstatus;
pid_t child;
while( (child = wait(&wstatus)) != -1 ) {
printf("child %ld died with status %d\n", (long)child, wstatus);
}