Eigener Kommandointerpreter / Seltsamer Return Fehler


Re: Seltsamer Return Fehler

<t>Ja, genau das hab ich ja geschrieben: Ich will einen Kommandointerpreter schreiben.</t>
 
Re: Seltsamer Return Fehler

<t>Ein "Kommandointerpreter" funktioniert üblicherweise so, dass das erste übergebene Kommando den Namen einer ausführbaren Datei innerhalb bestimmter Pfade ($PATH bzw. %PATH%) bezeichnet, welches dann vom Kernel ausgeführt wird.<br/>
Alles andere (Aliase und Builtins) muss tatsächlich hartkodiert im Interpreter vorliegen.<br/>
Beliebte Einträge in PATH sind zum Beispiel /usr/bin oder C:\Windows\system\system32. In den Verzeichnissen liegen dann Programme (Kommandos) wie etwa at, find, ftp, etc. Dadurch lassen sich beliebig Befehle hinzufügen, ohne dass der Programmierer der Shell (des Interpreters) diese auch nur kennen muss.</t>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="HolySmoke"><s>
HolySmoke said:
</s>Ein "Kommandointerpreter" funktioniert üblicherweise so, dass das erste übergebene Kommando den Namen einer ausführbaren Datei innerhalb bestimmter Pfade ($PATH bzw. %PATH%) bezeichnet, welches dann vom Kernel ausgeführt wird.<br/>
Alles andere (Aliase und Builtins) muss tatsächlich hartkodiert im Interpreter vorliegen.<br/>
Beliebte Einträge in PATH sind zum Beispiel /usr/bin oder C:\Windows\system\system32. In den Verzeichnissen liegen dann Programme (Kommandos) wie etwa at, find, ftp, etc. Dadurch lassen sich beliebig Befehle hinzufügen, ohne dass der Programmierer der Shell (des Interpreters) diese auch nur kennen muss.<e>
</e></QUOTE>
Ja ich weiß, aber jeder Kommandointerpreter hat auch interne Befehle wie cls oder dir, welche nicht als einzelne Binary in Verzeichnis rumliegen, sondern die als Funktionen eingebunden sind.<br/>
Außerdem: Den Pfad C:\Windows\system\system32 gibts nicht. Entweder C:\windows\system (9x-Reihe) oder C:\Windows\system32 (NT-Reihe) . Nur als kleine Anmerkung. Außerdem sind die DOS Kommandos in der 9x-Reihe nicht in C:\Windows\system gespeichert, sondern in C:\Windows\command</r>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="SebbiUltimate"><s>
SebbiUltimate said:
</s>
Ja ich weiß, aber jeder Kommandointerpreter hat auch interne Befehle wie cls oder dir, welche nicht als einzelne Binary in Verzeichnis rumliegen, sondern die als Funktionen eingebunden sind.
<e>
</e></QUOTE>
Aber es gibt keinen Grund, dass der Interpreter seine internen Fuktionen so aufrufen soll wie du das programmieren willst. Wenn du einen Interpreter schreibst dann legst du ja selbst fest welche Funktionen dieser hat, wie diese Funktionen heißen und bei welcher Eingabe welche Fuktion aufgerufen werden soll. Von daher ist es auch kein Problem das ganze mit einer if Bedingung zu lösen. Wenn Eingabe A dann Funktion B ausführen.</r>
 
Re: Seltsamer Return Fehler

<t>Okay, wenn bash das wirklich auch so gelöst hat, dann ja. Aber das bezweifel ich...</t>
 
Re: Seltsamer Return Fehler

<r>Guck doch einfach nach... <URL url="http://ftp.gnu.org/gnu/bash/bash-4.1.tar.gz">http://ftp.gnu.org/gnu/bash/bash-4.1.tar.gz</URL><br/>
Vermutlich wirst du da eine ganz andere Komplexität finden, als du erwartest. Da wirst du über Tools wie Lex/Flex und YACC/Bison stolpern.</r>
 
Re: Seltsamer Return Fehler

<r>Ja, da bin ich gerade dabei... wie es aussieht, startet das ganze bei der Datei bashrc in startup-files...<br/>
EDIT: Und ja...ich wusste schon vorher dass man den herunterladen kann, deshalb hab ich auch gefragt, ob jemand da herausfinden kann, wie es dort gelöst wurde...<br/>
( Ich gugg mir das Herz von Linux durch *gangster* <E>;)</E> )</r>
 
Re: Seltsamer Return Fehler

<t>Bevor du nun Tools wie Bison einsetzt, überleg dir bitte nochmal ob einfach if-else Bedingungen für dich nicht doch ausreichend sind. Du sagst ja selbst im Anfangspost dass du ein C Anfänger bist. So groß kann die Anzahl von Befehlen die du interpretieren willst gar nicht sein, als dass sich der Aufwand lohnen würde sich in Flex und Bison einzuarbeiten.</t>
 
Re: Seltsamer Return Fehler

<r>Das Problem ist eben, dass ich dies schon einmal in Clickexe (kennt das jemand?) einen echt tollen Kommandointerpreter geschrieben habe. Mit diesem konnte man nämlich sogar dann auf die Systemvariablen der Skriptsprache selbst zugreifen, weil diese immer aufgelöst wurden. Leider ist Clickexe so eine Skriptsprache und greift über die Vb/net oder ähnliches auf die Win32api zu. Dh. ich kann dies (natürlich) nicht für andere Platformen kompilieren. Also kann ich es auch nicht von Diskette bootbar machen (standalone Command Processor). Da ist der Haken, deshalb muss ich in C schreiben. <E>:-(</E></r>
 
Re: Seltsamer Return Fehler

<r>Das würde ich ihm auch nicht raten. Er macht nur soviele Vermutungen über die Bash, dass er wohl ein bisschen "enttäuscht" sein könnte, wenn er reinguckt, oder eingeschüchtert. <br/>
<br/>
Wie gesagt, ich kann das hier empfehlen: <br/>
<URL url="http://hg.icculus.org/icculus/physfs/file/5491e6c69162/test/test_physfs.c"><LINK_TEXT text="http://hg.icculus.org/icculus/physfs/fi ... t_physfs.c">http://hg.icculus.org/icculus/physfs/file/5491e6c69162/test/test_physfs.c</LINK_TEXT></URL><br/>
Ryan übergibt zwar die Parameter als einen String, obwohl er den schon vorher parst, aber ich denke, da dürfte alles drin sein, was SebbiUltimate möchte. <br/>
Und wenn man die ganzen cmd_* Funktionen ausser acht lässt, ist das ganze auch recht kompakt.</r>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="SebbiUltimate"><s>
SebbiUltimate said:
</s>Danke, aber welches ist die "entscheidende" Funktion?<e>
</e></QUOTE>
process_command</r>
 
Re: Seltsamer Return Fehler

<r>Das Gesuchte heißt "Reflection", wenn es umbedingt C sein muss wäre es am einfachsten mittels einer Hashtable aus Pointern zu implementieren. Diese Tabelle müsste zwar von hand angelegt werden (oder man schreibt sich nen kleines script dazu), aber damit kann mann dann einen Pointer zu der Funktion bekommen.<br/>
<br/>
<br/>

<CODE><s>
Code:
</s><i>
</i>Funktionsname|Pointer zu der Funktion
-------------------------------------
"test"            | void* test_ptr = test;
"function2"     | void* function2_ptr = function2;
.....
<e>
</e></CODE>

Bei C++ wäre es einfach mit boost::Reflection aus der Boost Bibliothek zu implementieren<br/>
<br/>
<br/>
Hier einmal in C++ ohne externe Bibliotheken gelöst und Kommentiert<br/>
<URL url="http://www.vollmann.ch/pubs/meta/meta/meta.html"><s></s>http://www.vollmann.ch/pubs/meta/meta/meta.html<e></e></URL><br/>
<br/>
Ich hoffe ich konnte helfen <E>;)</E></r>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="boeseronkel2k"><s>
boeseronkel2k said:
</s>
Ich hoffe ich konnte helfen <E>;)</E><e>
</e></QUOTE>
Ja, danke; noch eine Frage:<br/>
Läuft der Kommandointerpreter dann auch nativ ohne API, dh gibt der printf-Befehl, wenn man ihn unter Code:Blocks mit dem GNU GCC-Compiler als Konsolenanwendung kompilieren lässt, es auf der Standardausgabe aus, und ist es dann damit eigenständig bootfähig (wie z.B. Free Dos oder MS-DOS) ?</r>
 
Re: Seltsamer Return Fehler

<r>Ne zumindest die libc (C) [und die libstdc++ (C++)] werden gebraucht die die Funktionen zu implementieren.<br/>
<br/>
Der GNU GCC von Code::Blocks compiliert das Programm für die Windows Konsole,<br/>
unter einem DOS ist dies dann nicht lauffähig, dazu benötigt man einen Dos C oder C++ Compiler (DJGPP z.B.)<br/>
<br/>
Und selbst diese benötigen dann noch eine C/C++ Library<br/>
<br/>
Wenn ich das so Lese möchtest du vlt eine eigene Shell basteln, welche bootbar ist?<br/>
<br/>
Dann müsstest du selbst einen Kernel schreiben, welcher sich um Grafikausgabe etc kümmert,<br/>
eine libc um C Funktionen für das Programm zu Implementieren.<br/>
<br/>
Ein Beispiel für so eine (minimale) libc wäre die <URL url="http://www.fefe.de/dietlibc/"><s></s>dietlibc<e></e></URL><br/>
<br/>
und als kleinen Kernel könnte man <URL url="http://www.minix3.org/"><s></s>minix<e></e></URL> nehmen, da dieses noch einiegermaßen überschaubar ist.<br/>
<br/>
Viele Grüße,<br/>
b2k</r>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="boeseronkel2k"><s>
boeseronkel2k said:
</s>
<br/>
Wenn ich das so Lese möchtest du vlt eine eigene Shell basteln, welche bootbar ist?
<e>
</e></QUOTE>
Ja, genau so eine Shell ist die Grundlage jedes guten Betriebssystems.<br/>
<br/>
Was ich nicht verstehe: Bei purebasic ging es mir auch so, dass es nur für das Win-DOS Fenster kompiliert. Was ist denn da der Unterschied zwischen DOS-Programmen (die ja auch auf Windows laufen) und den Win32-Konsolenanwendungen?</r>
 
Re: Seltsamer Return Fehler

<r>Eine Windows Konsolenanwendung benutzt beispielsweise um auf der Konsole Text auszugeben die Windows API<br/>
Eine Dos Anwendung hingegen benutzt dazu die Funktionen des DOS Betriebssystems (insbesonders den Int 13)<br/>
<br/>
Wenn du ein Dos Programm unter Windows ausführst, wird es (so gut es geht) emuliert, das heißt Windows fängt z.B. den Interrupt 13 ab, wandelt die Anfrage in Funktionen der Windows API um, und führt diese dann aus.<br/>
<br/>
Somit benötigst du zu deiner Shell also zumindest Funktionen wie beispielsweise Text Ausgeben,<br/>
<br/>
um diese Bereiche Kümmert sich der Kernel, der Kernel nimmt somit die Anfrage des Programms entgegen "Gebe Text 234234342343\0 aus" entgegen und kümmert sich weiter um die Darstellung (Reicht es weiter an die Grafikkarte, wenn sie im Text modus ist, oder Rendert den Text im Framebuffer Modus sofern sich die Grafikkarte im Framebuffer-Modus befindet, und somit "nurnoch" Pixel darstellen kann)<br/>
<br/>
Ich hoffe ich konnte dir helfen und dir bewusst machen, dass dazu noch ganze Menge mehr gehört <E>;)</E><br/>
<br/>
Wie gesagt, wenn du das vorhast, kann ich dir wirklich Minix ans Herz legen, da es mit ca 13000 Zeilen Quelltext ein sehr kleiner Kernel ist,<br/>
dann die dietlibc als sehr kleine C Library und dann könntest du da drauf deine Shell aufbauen <E>;)</E></r>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="boeseronkel2k"><s>
boeseronkel2k said:
</s> Wie gesagt, wenn du das vorhast, kann ich dir wirklich Minix ans Herz legen, da es mit ca 13000 Zeilen Quelltext ein sehr kleiner Kernel ist,<br/>
dann die dietlibc als sehr kleine C Library und dann könntest du da drauf deine Shell aufbauen <E>;)</E><e>
</e></QUOTE>
Warum 13000 Zeilen? <URL url="http://www.henkessoft.de/OS_Dev/OS_Dev1.htm"><s></s>Hier<e></e></URL> wird das auch kürzer gelöst. Das wollte ich mit Code Blocks ein wenig "abschreiben". Eine tolle und ausführliche Anleitung.</r>
 
Re: Seltsamer Return Fehler

<r>Weil Minix Posix Kompatibel ist (kann also auch eine X11 Grafische Oberfläche wie unter Linux für Kompilieren und ausführen), <br/>
auch weil schon Treiber für Netzwerk etc dabei sind,<br/>
und das alles in den nur 13k Quelltextzeilen vom Kernel her <E>;)</E></r>
 
Back
Top