C 函数中 execvp 失败时杀死子进程

问题描述 投票:0回答:1

我在 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
任务失败时,如何在函数返回之前杀死创建的子进程?

c linux process fork
1个回答
0
投票

包含它的进程应该被删除,并且函数返回

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.