Обработка ошибок c ++ evecvp для неверной команды - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь реализовать простую оболочку. Все остальное работает отлично, за исключением обработки ошибок.

Когда я пытаюсь выполнить недопустимую команду, такую ​​как «cat ff», в которой «ff» не существует, я получаю следующее:

Terminal Output

Ожидаемое поведение должно быть как у третьего "catt f". Он должен начинаться с «ОШИБКА:», а затем с сообщением об ошибке, что означает, что это должно быть «ОШИБКА: cat: ff: Нет такого файла или каталога»

Как мне изменить свой код, чтобы добиться этого? Заранее спасибо!

#include <fcntl.h>
#include <iostream>
#include <unistd.h>
#include <cstring>
#include <errno.h>
#include <sys/wait.h>

using namespace std;

int main(){
    int pid;
    int status;
    char *cmd[] = {"cat", "ff", NULL};
    if ((pid = fork()) == 0){
        if (execvp(cmd[0], cmd) == -1){
            cout << "ERROR:" << strerror(errno) << '\n';
        }
    }else if (pid == -1){
        cout << "ERROR:" << strerror(errno) << '\n';
    }else{
        waitpid(pid, &status, 0);
        cout << "Status: " << status << '\n';
    }
}

Статус здесь не очень необходим здесь. Это просто моя попытка выяснить, стоит ли это до того сообщения об ошибке. Я супер новичок в этом, и я очень смущен и потерян. Пожалуйста, прости меня, если я сделал что-нибудь излишне.

1 Ответ

0 голосов
/ 22 января 2019

вторая строка cat: ff: No suche file... - вывод ошибки в канал stderr, записанный командой cat.Если вы хотите подавить это, вам нужно перенаправить канал stderr.Выполнение вашей команды оболочки «cat» было успешным, поэтому оно обрабатывается в соответствии с вашим последним условием else.Вам нужно проверить, например, статус 256 «нет такого файла», а затем самостоятельно распечатать ошибку.

#include <fcntl.h>
#include <iostream>
#include <unistd.h>
#include <cstring>
#include <errno.h>
#include <sys/wait.h>
#include <cstdio>

using namespace std;

int main(int argc, char** argv){
    int pid;
    int status;
    char *cmd[] = {"cat", "ff", NULL};
    int pipes[2];
    pipe(pipes);
    if ((pid = fork()) == 0){
        dup2(pipes[1], STDERR_FILENO);
        if (execvp(cmd[0], cmd) == -1){
            cout << "ERROR:" << strerror(errno) << '\n';
        }
    }else if (pid == -1){
        cout << "ERROR:" << strerror(errno) << '\n';
    }else{
        waitpid(pid, &status, 0);
        if(256 == status) {
            cout << "ERROR: ";
            char buffer[100];
            int count = read(pipes[0], buffer, sizeof(buffer)-1);
            if (count >= 0) {
                buffer[count] = 0;
                cout << buffer;
                cout << endl;
            } else {
                cout << "IO Error" << endl;
            }
        } else {
            cout << "Status: " << status << '\n';
        }
    }
}
...