2

からのエラーの処理方法について少し混乱しています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);
    //...
}

私が対処しようとしている 3 つのケースがあります。

  1. myCommand,myArgumentVector有効であり、コマンドが正しく実行されます。
  2. myCommand,myArgumentVectorは有効なパラメータですが、 の実行で問題が発生しmyCommandます。
  3. myCommand,myArgumentVector無効なパラメータ (たとえばmyCommand、見つからない) であり、execvp()呼び出しは失敗します。

私の主な関心事は、親プロセスが子のエラーを正しく処理するために必要なすべての情報を持っていることですが、それを行う方法が完全にはわかりません。

最初のケースでは、プログラムは終了ステータス 0 で終了したと思われます。WIFEXITED(status)つまり、マクロを呼び出すと、 true. これはうまくいくはずだと思います。

2 番目のケースでは、プログラムはおそらく 0 以外の終了ステータスで終了しました。これは、呼び出した場合WEXITSTATUS(status)、子呼び出しの特定の終了ステータスを取得する必要があることを意味しますmyCommand(これが正しくない場合はお知らせください)。

3番目のケースは、私に多くの混乱を引き起こしています。したがって、execvp()失敗した場合、エラーはグローバル変数に格納されますerrno。ただし、このグローバル変数は子プロセスからのみアクセスできます。まったく別のプロセスとしての親は、それを見ることができないと思います。これは、電話する必要があるということexit(errno)ですか? それとも、ここで何か他のことをしているはずですか?また、私が呼び出すと、親から戻るexit(errno)値を取得するにはどうすればよいですか?errnostatus

私の理解はまだ少し浅いので、私が探しているのは、これら 3 つのケースを処理する方法の理解の確認または修正です。

4

4 に答える 4

2

ケース 1 では、execvp()は返されません。親プロセスに返されるステータスは、子の終了ステータスになります — に何を提供するexit()か、または何から返すかmain()、または、子プロセスがシグナルで終了した場合、終了ステータスは異なりますが、検出可能です ( WIFSIGNALED、等)。これは、ステータスがゼロである必要がないことを意味することに注意してください。

ケース 2 で何を考えているのか (私には) 完全に明確ではありません。コマンドが開始されたが、呼び出されたオプションが拒否された場合、実際にはケース 1 ですが、終了ステータスがゼロになる可能性は小さいはずです。 (ただし、プログラムがエラー時にステータス 0 で終了することは知られています)。または、コマンドが見つからないか、見つかったが実行可能ではない場合、execvp()戻り、ケース 3 になります。

ケース 3 では、execvp()呼び出しは失敗します。それが戻ってくるので、あなたはそれを知っています。成功したものexecvp()は二度と戻りません。の戻り値をテストしても意味がありませんexecvp()。返されたという事実は、失敗したことを意味します。の設定からなぜ失敗したかがわかりますerrno。POSIX は 126 と 127 の終了ステータスを使用します —たとえばxargs、 とを参照してください。system()からのエラー コードをexecvp()調べて、それらのいずれかまたはその他のゼロ以外の値をいつ返す必要があるかを判断できます。

于 2013-11-19T06:22:14.933 に答える