Schreiben meiner eigenen shell... stecken auf Rohre?
Den letzten paar Tagen habe ich schon versucht zu schreiben, meine eigenen shell-Implementierung, aber ich habe wohl steckengeblieben immer auf die Rohre, um richtig zu arbeiten. Ich bin in der Lage zu analysieren, eine Linie und Gabel aus werden die Befehle zwischen den Rohren (ex: ls | sort) individuell, aber kann nicht scheinen, um Sie Rohr Eingang aus in die andere.
Ich denke, dass ich einfach nicht verstehen, wie dup2() und pipes richtig.
Ich habe jetzt meinen code immer noch nicht... 🙁 So stecken...
void forkAndExecute( char* arrayOfWords[] , vector<pid_t> *vectorOfPIDs , bool hasNextCmd , bool hasPrevCmd) {
int fd[ 2 ];
pid_t pid;
if( hasNextCmd ){
pipe(fd);
}
pid = fork();
//error if PID < 0
if( pid < 0 ) {
cerr << ">>> fork failed >>>" << endl;
exit(-1);
}
//child process if PID == 0
else if( pid == 0 ) {
if ( hasPrevCmd ){
dup2(fd[0] , 0);
close(fd[0]);
close(fd[1]);
}
if ( hasNextCmd ){
dup2(fd[1],1);
close(fd[0]);
close(fd[1]);
}
execvp( arrayOfWords[0] , arrayOfWords );
cout << ">>> command not found >>>" << endl;
//if logic reaches here, exec failed
exit(0);
}
//parent process
else{
close(fd[0]);
close(fd[1]);
//if( ! isLastCmd ){
//}
vectorOfPIDs->push_back(pid);
}
}
InformationsquelleAutor der Frage 101010110101 | 2009-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erster Vorschlag: Symbolische Konstanten, die besser sind als die magischen zahlen.
Zweiter Vorschlag: machen Sie einen Schritt zurück und überlegen Sie, was Sie versuchen zu erreichen.
Sie wollen, um zu laichen zwei Prozessen, wobei der erste Prozess stdout verbunden, um den zweiten Prozess stdin. Richtig?
So, in C bedeutet dies, dass Sie benötigen, um call
pipe
passfd[PIPE_WRITE]
auf das erste child-Prozesses, derdup2
1, und passfd[PIPE_READ]
dem zweiten Kind Prozess wirddup2
0.Einfach an
forkAndExecute'
s Prototyp zeigt, dass es nicht tun:Es behandelt nur einen einzelnen Befehl, und aus der Blick auf die argument-Liste, es sei denn, es greift zu bösen globalen Variablen, es gibt keine Möglichkeit für Sie zu erhalten, eine Datei-Deskriptor von seinem PrevCmd oder erhalten Sie einen Datei-Deskriptor von seinem NextCmd.
Überlegen, wie die Verwaltung der Datei-Deskriptoren, die Sie benötigen, und die Neugestaltung
forkAndExecute
in der Lage sein, diese zu verwenden.InformationsquelleAutor der Antwort Josh Kelley
Den Allgemeinen Prozess würde die Fehlerbehandlung für diese Basis-Verfahren (pseudocode):
Erstellen der pipe-ersten. Dann Gabel die Kind-Prozesse Erben. Eine Anpassung der file-Deskriptoren 0 (stdin) und 1 (stdout), so dass die Prozesse Lesen und schreiben den entsprechenden stellen. Schließen Sie alle übrigen file-Deskriptor, die Sie nicht wollen, dass die Kind-Prozesse zu sehen oder zu blockieren, wenn die Arbeit fertig ist. Exec die tatsächlichen Kind-Prozesse. Warten Sie, bis Sie fertig, und Sie sind fertig!
InformationsquelleAutor der Antwort JB.
ok Das ist für mich arbeiten. Hoffe das hilft dir:
InformationsquelleAutor der Antwort wakingrufus
Hier ist ein tutorial über UNIX-pipes, speziell darüber, wie zu bauen pipline in einem shell-Architektur:
http://www.cse.ohio-state.edu/~mamrak/CIS762/pipes_lab_notes.html
Nicht viel voll-code geschrieben, aber es beschreibt die Konzepte ziemlich gut.
Könnten Sie auch herunterladen source code für praktisch jede shell, wie bashtcshzshetc.
InformationsquelleAutor der Antwort Bill Karwin
Lesen Sie die Quellcode von Bashum zu sehen, wie Sie es Taten.
InformationsquelleAutor der Antwort RoliSoft
Wenn ich brauchte, um eine ähnliche shell vor einigen Jahren, habe ich das Buch Praktische Unix-Programmierung.
Es ist wirklich nützlich für die Beispiele, die auf viele IPC-Themen. Ich habe noch eine Kopie auf meinem Schreibtisch, dass ich mich auf von Zeit zu Zeit. Für $2 - $9 verwendet, ist es ein ziemlich guter Wert für was Sie bekommen.
Für was es Wert ist, dachte nur, ich erwähne es.
InformationsquelleAutor der Antwort Decker
Hier sind die Hinweise auf Rohr aus der Systemprogrammierung-Klasse habe ich im letzten semester.
InformationsquelleAutor der Antwort thepocketwade
Sind Sie mit jedem Programm Eingabe, um seine eigene Leistung. Sie wollte wohl die Verbindung jedes Programm die Ausgabe auf die nächste Eingabe statt.
Anstatt für den Allgemeinen Fall von n Prozesse in einer pipeline, beginnen Sie mit einer anhand von zwei und erweitern von dort aus. Sie gewinnen ein besseres Verständnis von der Art der Datei-Deskriptoren, die gesteckt sind einander, wenn Sie gehen durch die Ausweitung der Arbeit-code anstelle von Aufnahmen direkt für die komplexe Struktur.
InformationsquelleAutor der Antwort JB.
gut, ich habe darauf keine Antwort, aber ich arbeite an dem gleichen problem atm. Werde ich teilen, was ich habe. Es funktioniert für die beiden Befehle, aber nach dem es fertig ist läuft, i/o-unterbrochen sind. auf eine seltsame Weise, die ich nicht in der Lage gewesen, um herauszufinden, noch. den Klempner anrufen!
Habe ich das Gefühl es hat zu tun mit dem, was bin oder nicht bin, machen die nach dem wait()
InformationsquelleAutor der Antwort wakingrufus