Я пытаюсь реализовать операторы ||
, &&
и ;
в оболочке bash, которую я создаю. То, что я пытаюсь сделать, использует int
как флаг, который будет установлен в 1, если он был успешным, или 0, если это не так. Моя проблема заключается в том, что даже если я вхожу недопустимую операцию, например, как ls -apples
она устанавливает флаг 1. Я также получаю сообщение об ошибкеРеализация баш-операторов для оболочки в C++
лс неверный вариант - «е» Попробуйте «Ls --help» для получения дополнительной информации
поэтому, я думаю, это означает, что это технически выполняется? Как мне отслеживать, не выполнила ли execvp
операцию? Вот мой код:
pid_t pid;
pid_t waitId;
int status;
//forks into two processes
pid = fork();
//There was an error during fork
if (pid < 0)
{
successFlag = 0;
perror("There was an error");
}
else if (pid == 0)
{
//must be cast because our function expects a char *const argv[]
if (execvp(command[0], (char**)command) < 0)
{
//error at execvp
successFlag = 0;
perror("There was an error executing the process");
}
exit(EXIT_FAILURE);
}
else
{
do
{
waitId = waitpid(pid, &status, WUNTRACED | WCONTINUED);
if(waitId == -1){
successFlag = 0;
perror("Error in parent process");
exit(EXIT_FAILURE);
}
}
while (!WIFEXITED(status) && !WIFSIGNALED(status));
}
//use this flag to determine whether the process was a success
successFlag = 1;
Вы правы, команда ls бежала. Если я правильно понимаю вашу проблему, вы хотите определить, отправила ли команда сбой. В этом случае вам понадобится «код ошибки» (код выхода), возвращаемый командой. –
То, что я сделал, смотрел на значение 'status'' waitpid'. Я обнаружил, что любое значение, которое не было 0, было недействительным. Для этого я создал логический флаг. Действительно ли это? – ecain