2016-09-23 34 views
0

我正在C中實現一個shell,但是我遇到了文件重定向的問題。 我的問題是以下。如果我只輸入cat filename,我的外殼將顯示該文件並返回以提示等待下一個命令。但是,運行cat < filename後shell將退出。我的代碼已附加。文件重定向實現在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

你爲什麼要搞亂fork前進程的文件描述符? – user2357112

+0

我可能會看到你在說什麼。謝謝。 – Wei

+0

我最初的目的是試圖重用callExternals函數。 – Wei

回答

0

這似乎是一個功課問題...

從我可以告訴,你提取完整的命令(不帶「<文件名」)來執行,而你試圖打開一個文件描述符與「<」之後的文件名。

下一行51是沒有意義的。

問題是,一旦找到了位置,就會忽略它,只是使用'pos [0]',它是一些外部無關變量來查找文件名。您需要獲取「<」後面的令牌的值以獲取文件名。

+0

是的,我想在之後提取帶有參數和文件名的命令。矢量 pos店的位置'<', '>',「>>」或「|」。 pos向量會告訴我命令行中有多少重定向符號和管道。我會用pos來提取所有的命令和文件名,如果有的話。我弄亂了叉子。我無意中關閉了STDIN_FILENO。謝謝您的回答。 – Wei