对于如何处理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
    }
    

    10-04 19:10