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
Warum verwirren Sie die Dateideskriptoren des Pre-Fork-Shell-Prozesses? – user2357112
Ich könnte sehen, was du sagst. Vielen Dank. – Wei
Mein ursprünglicher Zweck versucht, die Funktion callExternals wiederzuverwenden. – Wei