からのエラーの処理方法について少し混乱しています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 つのケースがあります。
myCommand,myArgumentVector
有効であり、コマンドが正しく実行されます。myCommand,myArgumentVector
は有効なパラメータですが、 の実行で問題が発生しmyCommand
ます。myCommand,myArgumentVector
無効なパラメータ (たとえばmyCommand
、見つからない) であり、execvp()
呼び出しは失敗します。
私の主な関心事は、親プロセスが子のエラーを正しく処理するために必要なすべての情報を持っていることですが、それを行う方法が完全にはわかりません。
最初のケースでは、プログラムは終了ステータス 0 で終了したと思われます。WIFEXITED(status)
つまり、マクロを呼び出すと、 true
. これはうまくいくはずだと思います。
2 番目のケースでは、プログラムはおそらく 0 以外の終了ステータスで終了しました。これは、呼び出した場合WEXITSTATUS(status)
、子呼び出しの特定の終了ステータスを取得する必要があることを意味しますmyCommand
(これが正しくない場合はお知らせください)。
3番目のケースは、私に多くの混乱を引き起こしています。したがって、execvp()
失敗した場合、エラーはグローバル変数に格納されますerrno
。ただし、このグローバル変数は子プロセスからのみアクセスできます。まったく別のプロセスとしての親は、それを見ることができないと思います。これは、電話する必要があるということexit(errno)
ですか? それとも、ここで何か他のことをしているはずですか?また、私が呼び出すと、親から戻るexit(errno)
値を取得するにはどうすればよいですか?errno
status
私の理解はまだ少し浅いので、私が探しているのは、これら 3 つのケースを処理する方法の理解の確認または修正です。