Я реализую оболочку в 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 }
Что случилось с моим кодом? Благодаря
Почему вы возитесь с файловыми дескрипторами процесса pre-fork? – user2357112
Я мог бы видеть, что вы говорите. Спасибо. – Wei
Моя первоначальная цель - повторное использование функции callExternals. – Wei