对于如何处理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
的值?我的把握仍然有些微不足道,因此我对我对如何处理这三种情况的了解是肯定的还是正确的。
最佳答案
这是我尝试过的简单代码。
if(fork() == 0){
//do child stuff here
execvp(cmd,arguments); /*since you want to return errno to parent
do a simple exit call with the errno*/
exit(errno);
}
else{
//parent stuff
int status;
wait(&status); /*you made a exit call in child you
need to wait on exit status of child*/
if(WIFEXITED(status))
printf("child exited with = %d\n",WEXITSTATUS(status));
//you should see the errno here
}