2016-09-23 2 views
0

Я реализую оболочку в C. Но у меня есть проблема с перенаправлением файлов. Моя проблема в следующем. Если я нахожу только cat filename, моя оболочка отобразит файл и вернется в приглашение, ожидая следующей команды. Однако оболочка выйдет после запуска cat < filename. Мой код прилагается.Реализовать перенаправление в C

75 int callExternals(vector<string>& tokens){ 
76 pid_t childPid; 
77 
78 char** cstrings = new char*[tokens.size() + 1]; 
79 for (size_t i = 0; i < tokens.size(); ++i){ 
80  cstrings[i] = new char[tokens[i].size() + 1]; 
81  strcpy(cstrings[i],tokens[i].c_str()); 
82 } 
83 cstrings[tokens.size()] = NULL; 
84 switch (childPid=fork()){ 
85  case -1: 
86  perror("Unable to fork a process"); 
87  return -1; 
88  case 0: 
89  execvp(cstrings[0],cstrings); 
90  //_exit(EXIT_SUCCESS); 
91  default: 
92  waitpid(childPid,NULL,0); 
93 } 
94 return 0; 
95 } 

Часть реализации Перенаправление файла

40  case 1: 
42  vector<string> cmmd; 
43  cout << "tokens size "<<tokens.size()<<endl; 
44  for (vector<string>::iterator titer = tokens.begin(); titer != tokens.end(); titer++){ 
45   if (!(titer->compare("<"))) break; 
46   cmmd.push_back(*titer); 
48  } 
51  int fd = open(tokens[pos[0]+1].c_str(), O_RDONLY); 
52  dup2(fd, 0); 
53  close(fd); 
54  callExternals(cmmd); 
55 } 

Что случилось с моим кодом? Благодаря

+1

Почему вы возитесь с файловыми дескрипторами процесса pre-fork? – user2357112

+0

Я мог бы видеть, что вы говорите. Спасибо. – Wei

+0

Моя первоначальная цель - повторное использование функции callExternals. – Wei

ответ

0

Это похоже проблема в выполнении домашних заданий ...

Из того, что я могу сказать, вы извлекаете полную команду (без «< файла») для выполнения, и вы пытаетесь открыть дескриптор файла с именем файла после «<».

Самая следующая строка, 51, не имеет смысла.

Проблема заключается в том, что как только вы найдете это местоположение, вы проигнорируете его и просто используете «pos [0]», которая является некоторой внешней несвязанной переменной, чтобы найти имя файла. Вам нужно получить значение токена, следующего за «<», чтобы получить имя файла.

+0

Да, я пытаюсь извлечь команду с аргументами и именем файла после этого. Вектор pos хранит местоположение «<', '>», «>>» или «|». Положительные векторы скажут, сколько символов перенаправления и канала в командной строке. И я буду использовать pos, чтобы извлечь все команды и имя файла, если они есть. Я испортил вилку. Я закрыл STDIN_FILENO без цели. Спасибо за ваш ответ. – Wei

Смежные вопросы