Как мне получить команду pipe для принятия опций?

0

Я пишу оболочку для класса, и мне нужно реализовать трубы. Прямо сейчас мой код работает только тогда, когда первая команда не использует аргумент. Например: 'ls | wc -l 'работает, но' ls -l t | голова "нет.

void usePipe(string &command)
{
    int fd_pipe[2];
    int pid1;
    int pid2;
    int status;
    int wpid;
    string cmd1,cmd2;
    stringstream ss(command);
    vector<string> tok1,tok2;
    char **cmd1c;
    char **cmd2c;
    vector<const char*>args1,args2;

    pid1 = fork();
    if(pid1 == 0)
    {
        getline(ss,cmd1, '|');
        getline(ss,cmd2, '|');
        cmd1 = reduce(cmd1);
        cmd2 = reduce(cmd2);
        cout << cmd1 << "|" << endl;
        cout << cmd2 << "|" << endl;

        tok1 = split(cmd1,' ');
        tok2 = split(cmd2, ' ');
        for(int i = 0; i < tok1.size(); i++)
        {
            if(tok1.at(i).c_str()[0] != '\0')
            {
                args1.push_back(tok1.at(i).c_str());
                cout << "Pushed command: " << args1.back() << endl;
            }
        }
        args1.push_back(NULL);
        cmd1c =(char**) &args1[0];

        for(int i = 0; i < tok2.size(); i++)
        {
            if(tok2.at(i).c_str()[0] != '\0')
            {
                args2.push_back(tok2.at(i).c_str());
                cout << "Pushed command: " << args2.back() << endl;
            }
        }
        args2.push_back(NULL);
        cmd2c =(char**) &args2[0];

        pipe(fd_pipe);

        pid2 = fork();
        if(pid2 == 0)
        {
            cout << "in second child" <<endl;
            dup2(fd_pipe[1],1);
            close(fd_pipe[0]);
            close(fd_pipe[1]);
            execvp(cmd1c[0], cmd1c);
            perror("Exec Failed ");
            exit(5);
        }
        cout << "in first child"<< endl;
        dup2(fd_pipe[0],0);
        close(fd_pipe[0]);
        close(fd_pipe[1]);
        execvp(cmd2c[0], cmd1c);
        perror("Exec Failed ");
        exit(5);
    }
    wpid = wait(&status);
    cout << "Shell process "<< pid1 << " exited with status " << (status >> 8) <<  endl;
}
  • 0
    Ну, в чем, на ваш взгляд, проблема? Что происходит, когда вы запускаете его в отладчике или распечатываете некоторые промежуточные значения из анализа командной строки?
  • 0
    Я делал это. Обратите внимание на всю куту везде. Все аргументы помещаются в вектор args1 и arg2, но когда я его запускаю, я получаю ls: invalid option - 'l'.
Показать ещё 3 комментария
Теги:

1 ответ

0

Найди его. В первом ребенке я приводил execvp неправильные аргументы. Это должно быть

execvp(cmd2c[0], cmd2c);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню