我对如何处理来自execvp()
. 到目前为止,我的代码如下所示:
int pid = fork();
if (pid < 0) {
// handle error.
}
else if (pid == 0) {
int status = execvp(myCommand,myArgumentVector); // status should be -1 because execvp
// only returns when an error occurs
// We only reach this point as a result of failure from execvp
exit(/* What goes here? */);
}
else {
int status;
int waitedForPid = waitpid(pid,&status,0);
//...
}
我试图解决三种情况:
myCommand,myArgumentVector
有效并且命令正确执行。myCommand,myArgumentVector
是有效参数,但在执行myCommand
.myCommand,myArgumentVector
是无效参数(例如myCommand
无法找到)并且execvp()
调用失败。
我主要担心的是父进程将拥有正确处理子错误所需的所有信息,我不完全确定如何做到这一点。
在第一种情况下,程序可能以退出状态 0 结束。这意味着如果我要WIFEXITED(status)
在宏中调用,我应该得到true
. 我认为这应该可以正常工作。
在第二种情况下,程序可能以非 0 的退出状态结束。这意味着如果我要调用,WEXITSTATUS(status)
我应该得到子调用的特定退出状态myCommand
(如果这不正确,请告知)。
第三种情况让我很困惑。因此,如果execvp()
失败,则错误将存储在全局变量errno
中。但是这个全局变量只能从子进程访问;父母作为一个完全独立的过程,我认为看不到它。这是否意味着我应该打电话exit(errno)
?还是我应该在这里做点别的事情?另外,如果我打电话,我exit(errno)
怎么能从父母那里得到errno
回来的价值?status
我的掌握仍然有点脆弱,所以我正在寻找的是确认或纠正我对如何处理这三种情况的理解。