Eigener Kommandointerpreter / Seltsamer Return Fehler


SebbiUltimate

Still Fresh
Joined
Jun 17, 2010
Messages
372
Re: Seltsamer Return Fehler

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

HolySmoke

Guardian Lion
Joined
Feb 2, 2009
Messages
199
Location
Kaub, RLP, Germany
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>
 

SebbiUltimate

Still Fresh
Joined
Jun 17, 2010
Messages
372
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>
 

chrysipp

Still Fresh
Joined
Mar 13, 2010
Messages
189
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>
 

SebbiUltimate

Still Fresh
Joined
Jun 17, 2010
Messages
372
Re: Seltsamer Return Fehler

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

Evil Azrael

Newbie
Joined
Jan 20, 2010
Messages
109
Location
Rheinkilometer 666 & hinter Heidelberg
Website
www.evilazrael.de
ICQ
78819723
WEBSITE
http://www.evilazrael.de
LOCATION
Rheinkilometer 666 & hinter Heidelberg
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>
 

SebbiUltimate

Still Fresh
Joined
Jun 17, 2010
Messages
372
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>
 

chrysipp

Still Fresh
Joined
Mar 13, 2010
Messages
189
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>
 

SebbiUltimate

Still Fresh
Joined
Jun 17, 2010
Messages
372
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>
 

Evil Azrael

Newbie
Joined
Jan 20, 2010
Messages
109
Location
Rheinkilometer 666 & hinter Heidelberg
Website
www.evilazrael.de
ICQ
78819723
WEBSITE
http://www.evilazrael.de
LOCATION
Rheinkilometer 666 & hinter Heidelberg
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>
 

Jan-Nik

Active Member
Joined
Jan 5, 2009
Messages
534
Location
Germany
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>
 

boeseronkel2k

Still Fresh
Staff member
Joined
Oct 9, 2005
Messages
985
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>
 

SebbiUltimate

Still Fresh
Joined
Jun 17, 2010
Messages
372
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>
 

boeseronkel2k

Still Fresh
Staff member
Joined
Oct 9, 2005
Messages
985
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>
 

SebbiUltimate

Still Fresh
Joined
Jun 17, 2010
Messages
372
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>
 

boeseronkel2k

Still Fresh
Staff member
Joined
Oct 9, 2005
Messages
985
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>
 

SebbiUltimate

Still Fresh
Joined
Jun 17, 2010
Messages
372
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>
 

boeseronkel2k

Still Fresh
Staff member
Joined
Oct 9, 2005
Messages
985
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>
 
Top