2016-09-23 2 views
0

Ich implementiere eine Shell in C. Aber ich habe ein Problem mit der Dateiumleitung. Mein Problem ist das folgende. Wenn ich nur cat filename tippe, wird meine Shell die Datei anzeigen und zurück zur Eingabeaufforderung für den nächsten Befehl zurückkehren. Die Shell wird jedoch nach dem Ausführen von cat < filename beendet. Mein Code ist angehängt.Implementieren Umleitung in 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 } 

Ein Teil der Dateiumleitung Implementierung

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 } 

Was mit meinem Code falsch? Dank

+1

Warum verwirren Sie die Dateideskriptoren des Pre-Fork-Shell-Prozesses? – user2357112

+0

Ich könnte sehen, was du sagst. Vielen Dank. – Wei

+0

Mein ursprünglicher Zweck versucht, die Funktion callExternals wiederzuverwenden. – Wei

Antwort

0

Dies scheint ein Hausaufgaben Problem ...

Von dem, was ich sagen kann, Sie den vollständigen Befehl extrahieren (ohne die „< Dateiname“) auszuführen, und Sie versuchen, einen Dateideskriptor zu öffnen mit dem Dateinamen nach dem "<".

Die nächste Zeile, 51, macht keinen Sinn.

Das Problem ist, dass sobald Sie den Speicherort finden, Sie es ignorieren und nur 'POS [0]' verwenden, die eine externe Variable ohne Bezug ist, um den Dateinamen zu finden. Sie müssen den Wert des Tokens abrufen, das auf "<" folgt, um den Dateinamen abzurufen.

+0

Ja, ich versuche, den Befehl mit Argumenten und Dateinamen nachher zu extrahieren. Vektor pos speichert den Speicherort von '<', '>', ">>" oder "|". Die POS-Vektoren werden mir sagen, wie viele Umleitungssymbole und Pipe in der Befehlszeile. Und ich werde POS verwenden, um alle Befehle und den Dateinamen zu extrahieren, falls vorhanden. Ich habe mich mit Gabel herumgeschlagen. Ich habe STDIN_FILENO ohne Grund geschlossen. Vielen Dank für Ihre Antwort. – Wei