建立一个shell - IO麻烦

时间:2011-10-05 04:03:50

标签: c++ shell file-io

我正在为系统编程类开发一个shell。我在文件重定向方面遇到了一些麻烦。我只是将输出重定向到工作,e.x。 “ls> a”然而当我在我的shell中输入像“cat< a”这样的命令时,它会删除文件中的所有内容。我觉得问题源于第二个if语句 - “fdin = open(_inputFile,777)”

如果是这种情况,我们非常感谢您推荐教程/其他示例的链接。

在旁注中,我包含了整个功能,但是在创建管道时,我还没有测试过任何东西。我不相信它可以正常工作,但这可能是因为另一个文件中的错误。

void Command:: execute(){

    if(_numberOfSimpleCommands == 0){

    prompt();
        return;
    }

    //save input/output
    int defaultin = dup(0);
    int defaultout = dup(1);

    //initial input
    int fdin;
    if(_inputFile){
        fdin = open(_inputFile,0777);
    }else{
        //use default input
        fdin = dup(defaultin);
    }

    //execution
    int pid;
    int fdout;
    for(int i = 0; i < _numberOfSimpleCommands; i++){
        dup2(fdin,0);
        close(fdin);

        //setoutput
        if(i == _numberOfSimpleCommands -1){
            if(_outFile){
                fdout = creat(_outFile,0666);
            }else{
                fdout = dup(defaultout);
            }
        }else{
            int fdpipe[2];
            pipe(fdpipe);
            fdout = fdpipe[0];
            fdin = fdpipe[1];
        }
        dup2(fdout,1);
        close(fdout);

        //create child
        pid = fork();
        if(pid == 0){
            execvp(_simpleCommands[0]->_arguments[0],_simpleCommands[0]->_arguments);
            perror("-myshell");
            _exit(1);
        }
    }
    //restore IO defaults
    dup2(defaultin,0);
    dup2(defaultout,1);
    close(defaultin);
    close(defaultout);

    if(!_background){
        waitpid(pid,0,0);
    }
}

if(_numberOfSimpleCommands == 0){ prompt(); return; } //save input/output int defaultin = dup(0); int defaultout = dup(1); //initial input int fdin; if(_inputFile){ fdin = open(_inputFile,0777); }else{ //use default input fdin = dup(defaultin); } //execution int pid; int fdout; for(int i = 0; i < _numberOfSimpleCommands; i++){ dup2(fdin,0); close(fdin); //setoutput if(i == _numberOfSimpleCommands -1){ if(_outFile){ fdout = creat(_outFile,0666); }else{ fdout = dup(defaultout); } }else{ int fdpipe[2]; pipe(fdpipe); fdout = fdpipe[0]; fdin = fdpipe[1]; } dup2(fdout,1); close(fdout); //create child pid = fork(); if(pid == 0){ execvp(_simpleCommands[0]->_arguments[0],_simpleCommands[0]->_arguments); perror("-myshell"); _exit(1); } } //restore IO defaults dup2(defaultin,0); dup2(defaultout,1); close(defaultin); close(defaultout); if(!_background){ waitpid(pid,0,0); } }

1 个答案:

答案 0 :(得分:1)

您的通话open(_inputFile, 0777)不正确。 open的第二个参数应该包含指定访问模式和文件创建标志的值的按位或组合,以及其他内容(O_RDONLYO_WRONLY等)。由于您传递了0777,因此最终可能同时包含O_CREATO_TRUNC,这会导致_inputFile被删除。您可能需要open(_inputFile, O_RDONLY)