Пользовательская оболочка C ++: ошибка сегментации метода перенаправления Stdin

В настоящее время я создаю свою собственную простую оболочку на C ++, которая реализует трубопровод, < ,> и >> перенаправление без использования системы.

Все мои реализации работают, кроме одного. Я получаю ошибку сегментации с моей стандартной реализацией перенаправления ввода. Пример: cat < file.txt

Мой шелл-код анализирует ввод подсказки (argv / argc) в другом методе и вызывает метод перенаправления ввода-вывода. Каждая функция перенаправления имеет свой собственный метод.

Мой метод перенаправления ввода / вывода stdin принимает в качестве параметров команду двойного указателя и файл двойного указателя.

void redirect(char** cmd, char** file) {
//declare variables
int fd;
char c;
pid_t pid;

fd = open(file[0], O_RDWR | O_CREAT, 0666);

//opens if no error
if (fd < 0) {
printf("Error: %s\n", strerror(errno));
exit(1);
}

dup2(fd, 0);

execvp(cmd[0], cmd);
perror(cmd[0]);       /* execvp failed */
exit(1);
}

Моя оболочка компилируется и запускается успешно. Тем не менее, когда я вхожу:

cat < file.txt

Ошибка сегментации (ядро сброшено)

Мои другие реализации ввода / вывода для перенаправления имеют точно такие же переданные параметры и работают, так что я думаю, что мой стандарт «<«метод неправильно реализован.

Работает

  1. cat> file.txt
  2. cat >> file.txt
  3. cat f.txt> file.txt
  4. cat f.txt >> file.txt
  5. труба (|) метод работает

Буду очень признателен за любые разъяснения. Я немного растерялся после исследования dup2 а также execvp форумы. Пожалуйста, скажите мне, если что-то не так с моей реализацией метода.

Основной метод

373 //main method
374 int main() {
375   char *argv[ARGSMAX], *p1[ARGSMAX], *p2[ARGSMAX];
376   Pipeline pipe_redirect;
377   int argc;
378   //gets present working directory
379   char *name = NULL;
380   size_t size = 0;
381   name = getcwd(name,size);
382   // prompt until user quits
383   while (true) {
384     cout << "1730sh:" << name << "$ ";
385
386     //read user input
387     argc = readInput(argv);
388
389     //parse input
390     pipe_redirect = parse(argc, argv, p1, p2);
391     if (pipe_redirect == PIPE)
392       pipeD(p1, p2);
393     else if (pipe_redirect == APPEND)
394       append(p1, p2);
395     else if (pipe_redirect == TRUNCATE)
396       redirect(p1,p2);
397     else if(pipe_redirect == TRUNCOUT)
398       truncOut(p1,p2);
399     else if(pipe_redirect == ETRUNCATE)
400       eTruncate(p1,p2);
401     else if(pipe_redirect == EAPPEND)
402       eAppend(p1,p2);
403     else
404       runP(argc, argv);
405
406     // set argv to null
407     for (int i=0; i<argc; i++)
408       argv[i] = NULL;
409   }
410   return 0;
411 }

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]