【发布时间】:2013-11-19 05:21:21
【问题描述】:
我对如何处理来自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),我怎样才能从父级的status 中获取errno 的值?
我的掌握仍然有点薄弱,所以我正在寻找的是确认或纠正我对如何处理这三种情况的理解。
【问题讨论】:
-
-1或EXIT_FAILURE应该足够了。 -
但我想保留
errno的值... -
那为什么不退出(-errno)呢?可能需要投射它,但这种形式的东西可能会起作用......
-
这有什么帮助?我不明白退出代码值与 waitpid 分配的整数状态之间的关系。