使用execvp时如何区分执行案例?

使用execvp时如何区分执行案例?,c,C,使用EXEVP时,我如何区分命令执行失败和命令执行以非零退出代码结束的情况?如果exec失败,则通常会退出(127),然后让父级将该退出代码解释为exec失败(shell、system和posix_spawn都会这样做——这实际上意味着它们无法判断子级是否执行了exec并返回了127,或者exec是否失败) 如果您想要一个超级健壮的解决方案,您可以在分叉之前创建一个带有O\u CLOEXEC标记的管道,然后让子进程通过该管道将execv引发的errno发送给父进程。如果命令执行失败(即未启动)e

使用EXEVP时,我如何区分命令执行失败和命令执行以非零退出代码结束的情况?

如果exec失败,则通常会退出(127),然后让父级将该退出代码解释为exec失败(shell、
system
posix_spawn
都会这样做——这实际上意味着它们无法判断子级是否执行了exec并返回了127,或者exec是否失败)


如果您想要一个超级健壮的解决方案,您可以在分叉之前创建一个带有
O\u CLOEXEC
标记的管道,然后让子进程通过该管道将execv引发的errno发送给父进程。

如果命令执行失败(即未启动)
execvp
将返回-1,
errno
将包含相关的错误代码


如果命令执行成功,
execvp
不会返回。调用
execvp
的父进程可以调用
wait
获取命令的返回值,无论返回值是零还是非零。

您是否阅读了手册页?“当命令执行以非零退出代码结束时”然后命令被执行。因此
execvp()
确实成功。如果
execvp()
成功,则不会返回。然后父级需要调用
wait()
waitpid()
来收集进程的返回代码。