В настоящее время я создаю свою собственную простую оболочку на 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
Ошибка сегментации (ядро сброшено)
Мои другие реализации ввода / вывода для перенаправления имеют точно такие же переданные параметры и работают, так что я думаю, что мой стандарт «<«метод неправильно реализован.
Работает
Буду очень признателен за любые разъяснения. Я немного растерялся после исследования 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 }
Задача ещё не решена.
Других решений пока нет …