Я немного не понимаю, как обрабатывать ошибки из 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
в родительском элементе?
Мое понимание все еще немного слабое, поэтому я ищу либо подтверждение, либо исправление в моем понимании того, как обращаться с этими тремя случаями.
-1
илиEXIT_FAILURE
должно быть достаточно. - person Mihai Maruseac   schedule 19.11.2013errno
... - person Kvass   schedule 19.11.2013