построение оболочки - проблема ввода-вывода - PullRequest
0 голосов
/ 05 октября 2011

Я работаю над оболочкой для класса системного программирования. У меня возникли проблемы с перенаправлением файлов. Я только что перенаправил вывод на работу, например. "ls> a", однако, когда я набираю команду типа "cat

Если это так, то ссылка на рекомендованный учебник / другие примеры будет очень полезна.

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

void Command:: execute(){</p> <pre><code> 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 Ответ

1 голос
/ 05 октября 2011

Ваш звонок open(_inputFile, 0777) неверен. Второй аргумент open должен содержать побитовую или быструю комбинацию значений, которые среди прочего определяют режим доступа и флаги создания файла (O_RDONLY, O_WRONLY и т. Д.). Поскольку вы передаете 0777, это, вероятно, в конечном итоге содержит как O_CREAT, так и O_TRUNC, что приводит к удалению _inputFile. Вы, вероятно, хотите open(_inputFile, O_RDONLY).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...