Umleitung im inneren Aufruf von execvp() funktioniert nicht
Habe ich die Umsetzung ein kleines Programm, führt einen bestimmten Befehl mit execvp(). Es funktioniert gut, wenn Sie nicht mit der Umleitung, aber wenn ich einen Befehl wie:
cat file1.txt > redirected.txt
cat-Ausgänge der folgenden Fehlermeldungen angezeigt wird, und schlägt fehl:
cat: >: No such file or directory
cat: redirected.txt: No such file or directory
Ich habe einige Graben um und ich fange an zu denken, dass vielleicht execvp() ist nicht erlaubt zu tun, Umleitung, weil es nicht ausführen in der shell. Bedeutet das, ich müsste manuell aussuchen, die Sie bei der Umleitung tritt auf, und verwenden Sie Rohre in meinem fork/exec-code, um diese Einschränkung? Gibt es einen besseren Weg, als mit execvp()?
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre "kleine Programm, führt ein gegebenen Befehl aus," ist im wesentlichen ein shell. Da Sie schreiben ein shell, ist es Ihre Aufgabe, Sie zu implementieren, die Umleitungen mit dem, was syntax, die Sie wünschen. Die
>
redirection-operator ist keine Funktion des kernel, eine shell-Funktion.Umzusetzen
sh
-Stil Umleitung, müssen Sie analysieren den Befehl, suchen Sie die Umleitung Betreiber, die Dateien zu öffnen und ordnen Sie input/output-Deskriptoren. Dies muss getan werden vor aufrufenexecvp
. Schauendup2
system nennen.Können Sie mit system (), wenn Sie wirklich wollen, um zu verwenden, dass diese Art der syntax. Als Sie bemerkt, Umleitung und wildcard-expansion und eine ganze Reihe anderer Dinge behandelt werden, die von der shell auf Unix-ähnlichen Systemen.
Den Weg, es zu tun mit der Gabel sieht ungefähr so aus:
fd
(oder set seine close-on-exec-flag). So wie es da steht, der Prozess bekommt einen extra open file descriptor. Nicht schrecklich schädlich hier, aber könnte ein problem in anderen Kontexten.Es scheint, wie die einfachste Sache zu tun ist:
Können Sie das gleiche tun mit
execvp
.execvp
(eher als die high-level -system
) genau zu vermeiden, der Einsatz der shell, für pädagogische Zwecke. 🙂