Mit C das OS rausfinden
-
Natürlich ist das üblich. Warum sollte embedded-Hardware wie Router ein fertiges Betriebssystem bekommen, was für andere Dinge ausgelegt ist?
Na warum wohl? Weil man sich den Entwicklungsaufwand spart! Gerade bei Routern sind freie Systeme wie Linux oder *BSD geeignet.
-
Prinzipiell sehe ich da gerade Schwarz. Wie schon sehr oft angesprochen gibts keine Möglichkeiten (Sicher) zur Laufzeit heraus zu finden auf welchen BS du dich befindest. Das seltsame Datenformat (*.shx Dateien) was du verwendest zeigt wohl das es wohl mit einen eigenen BS zu tun hast. Dein Compiler läuft nur bei dir auf den Rechner. Aber das Compilat ist wohl nichtmal ohne weiteres unter dos/linux/windows ausführbar (Der begriff Cipherlab OS fiel hier schon). Damit kannst du wohl auch die verwendung von ODBC vergessern sofern es nicht zufällig eine Implementierung dafür gibt. Wenn aber das Cipherlab OS gar keinen ODBC Support an sich anbietet, wirds das nicht geben. Ggf hat deren API eigene DB Schnittstellen. Gerade für solche eigenen BS ist man ohnehin sehr eingeschänkt was Fremdlibs angeht.
-
Compiler ist auf Dos Ebene
Was meinst du damit? Kommandozeile ist nicht gleich Dos-Ebene.
*.shx Datei raus, übertrage die Datei auf das Gerät
Na endlich wirst du etwas konkreter. Tja, was fuer ein Geraet?
Na warum wohl? Weil man sich den Entwicklungsaufwand spart! Gerade bei Routern sind freie Systeme wie Linux oder *BSD geeignet.
Das entscheiden ganz andere. Die Telekom setzt auf Linux, die Fritz-Box hat ein eigenes.
-
knivil schrieb:
Das entscheiden ganz andere. Die Telekom setzt auf Linux, die Fritz-Box hat ein eigenes.
Falsch. Sowohl der rosa Riese als auch Fritz setzen auf einen Linux Kernel und andere auf Linux übliche Programme. Es werden nur spezielle Treiber und Patches in den Kernel eingebunden und ein eigenes Webinterface gebaut. Dann wird das System so zu gemacht, dass der normale Anwender nichts mehr von den Linux mitbekommt.
Die einzigen Router die ich kenne, die nicht auf Linux basieren sind einerseits einige Netgear geräte die auf etwas komischen basieren, wo ich immer den Namen vergessen und die Apple geräte die auf BSD aufbauen, weil BSD wohl näher an ihren Mac OS X dran ist.
-
Also, das traurige ist, das es in jedem Forum einen wie Janjan geben muss, der sich nur mit Leuten unterhält die auf seinem Niveau sind und den Rest immer nur als Anfänger beschimpfen kann. Ich habe aus Foren schon so einiges gelernt, von mittlerweile 5 Programmiersprachen von denen ich mittlerweile 2 beruflich ausübe, bis zu einem ohne Fachwissen oder Büchern selbst getätigten Zylinderwechsel bei einem Auto.
Also danke an alle konstruktiven Ratschläge oder Leute die behaupten es nicht zu wissen. Dank solcher Leute lerne ich wenigstens dazu.
Ich habe parallel dazu im Internet gesucht und bin darauf gestossen:
#ifdef WINDOWS puts ("WINDOWS"); #elif defined(WIN32) puts ("WIN32"); #elif defined(linux) puts ("linux"); #else puts ("nein"); #endif
Plus diese Liste im Internet. Es spuckt zumindest ein nein raus, aber das wäre ja auch ok bei einem eigens entwickelten OS. Hätte einer von euch Zeit einen Gegentest zu machen oder liege ich wieder falsch.
Und gleich im vorab. Alle die Beleidigen wollen, sollen mich und meine Beiträge einfach bitte ignorien.
-
p1royal2 schrieb:
Also, das traurige ist, das es in jedem Forum einen wie Janjan geben muss, der sich nur mit Leuten unterhält die auf seinem Niveau sind und den Rest immer nur als Anfänger beschimpfen kann.
Naja, weisst du, es kommt auch ein wenig darauf an, wie man sich selber präsentiert. Ganz am Anfang hat Janjan gesagt:
Janjan schrieb:
p1royal2 schrieb:
Gibt es einen Trick mit Standard C Befehlen das richtige Betriebssystem zu erfahren?
Nein. Definitiv nicht. Das sinnvollste ist immernoch mit Makros bedingte Kompilation zu haben, wobei das Makro halt vom Benutzer beim kompilieren definiert werden muss (Ausnahme sie vordefinierte Makros).
Visual Studio definiert z.B. automatisch WIN32.
(Hervorhebung eingesetzt)
Kurz darauf hast du geantwortet:
p1royal2 schrieb:
Also mir geht es um eine ODBC Bibliothek. Und mit Makros fang ich lieber mal nicht an. Und es ist kein Windows, aber was es ist, kann ich überhaupt nicht einschätzen! Gibt es keine Systemvariablen?
(Hervorhebung eingesetzt)
Und was präsentierst du uns nun 3 Seiten später? Eine Lösung mit Makros. Dir ist hoffentlich auch klar, dass deine Lösung das OS nicht zur Laufzeit rausfindet, sondern probiert es während der Kompilierung durch bedingte Kompilation herauszufinden?
Aber wie schon andere gesagt haben, es gibt keine Möglichkeiten mit C ohne Wissen über das zugrunde liegende System herauszufinden, auf welchen OS das Programm läuft.
Die Informationen zum OS sollten dem Gerät beigelegt sein, bzw. in den Entwicklungswerkzeugen vorhanden sein. Irgendwo steht dies ganz sicher. Irgendwo sind ja wohl auch die Schnittstellen des OS spezifiziert. Du musst doch irgendwelche Dokumentation dazu haben, sonst kannst du die Entwicklung darauf gleich vergessen. Und wenn sie nicht vorhanden sind, dann gibt es keinen schnelleren Weg, als sie vom Hersteller anzufordern.
Grüssli
-
p1royal2 schrieb:
Also, das traurige ist, das es in jedem Forum einen wie Janjan geben muss, der sich nur mit Leuten unterhält die auf seinem Niveau sind und den Rest immer nur als Anfänger beschimpfen kann. Ich habe aus Foren schon so einiges gelernt, von mittlerweile 5 Programmiersprachen von denen ich mittlerweile 2 beruflich ausübe, bis zu einem ohne Fachwissen oder Büchern selbst getätigten Zylinderwechsel bei einem Auto.
Also danke an alle konstruktiven Ratschläge oder Leute die behaupten es nicht zu wissen. Dank solcher Leute lerne ich wenigstens dazu.
Ich habe parallel dazu im Internet gesucht und bin darauf gestossen:
#ifdef WINDOWS puts ("WINDOWS"); #elif defined(WIN32) puts ("WIN32"); #elif defined(linux) puts ("linux"); #else puts ("nein"); #endif
Leck mich. Das ist genau das, was ich erwähnt habe. Bedingte Kompilation.
-
@Janjan: Lass es halt bitte einfach sein, ich habe keinen Bock auf Krümel an Hilfe gepaart mit Beleidigungen. Das ich ein Anfänger bin musst du mir nicht klar machen.
@Dravere: Hab ja auch 3 Seiten lang auf was einfacheres gehofft. Ich kapiere das nämlich nicht, warum das mit der bedingten Kompilation nicht klappt, bzw. was da überhaupt vor sich geht.
Ich habe eh die Alternative über Sockets anfragen (an ein PHP/CGI Script von mir) als Client zu übermitteln und das Ergebnis auswerten. Leider nicht so elegant da ein Webserver dauernd laufen muss und ich es etwas professioneller anpacken wollte. Da seit einer Woche die achte Mail an irgendeine Hersteller Adresse nicht beantwortet wurde, muss ich es dann wohl aufgeben.
Schade, aber danke für die viele Hilfe!
-
p1royal2 schrieb:
@Dravere: Hab ja auch 3 Seiten lang auf was einfacheres gehofft. Ich kapiere das nämlich nicht, warum das mit der bedingten Kompilation nicht klappt, bzw. was da überhaupt vor sich geht.
Das war schon eher klar. Was passiert ist folgendes:
Bei einem Compiler ist eine bestimmte Version der C-Standardbibliothek dabei. In deren Headern stehen dann Sachen drin, die speziell auf das System ausgelegt sind, für das compiliert werden soll. Unter anderem wird zum Beispiel definiert, für welches Betriebssystem compiliert wird. Unter Linux steht dann also in irgendeiner der vielen Headerdateien die in deinen Code eingebunden werden:
#define linux
Dies ist ein Makro. Und da es definiert ist, ist es in deinem Code verfügbar. Die anderen nicht. Was nun bei deinem Code passiert ist folgendes:
#ifdef WINDOWS puts ("WINDOWS"); #elif defined(WIN32) puts ("WIN32"); #elif defined(linux) puts ("linux"); #else puts ("nein"); #endif
Wenn "linux" gesetzt wird, geht der Preprozessor durch die #ifdefs durch und schaut welches gesetzt ist. Die die nicht gelten, überspringt er sie einfach inklusive dem Code den sie generieren würden. Am Ende ist nur "linux" definiert und nach dem preprozessor sieht dein Code für den Compiler nur noch so aus:
puts ("linux");
das ist dann das was auch in deinem Endprogramm steht. Wenn du das programm disassemblierst und dich durch die Datei wühlst, wirst du die strings "WINDOWS" oder "WIN32" nicht mehr finden können. Sondern nur eine Ausgabe für "linux".
-
Aber dann bin ich doch schon meiner Lösung ganz nah. Was ich mache, ist mit if abfragen das richtige zu finden. Kann ich nicht aus der Standardbibliothek des Herstellers die Header rauslesen oder hinschreiben lassen? Mit der Information kann ich doch weiter experimentieren!?
-
Dir fehlt elementares Grundwissen. Lern programmieren, bevor du programmierst.
-
p1royal2 schrieb:
Kann ich nicht aus der Standardbibliothek des Herstellers die Header rauslesen oder hinschreiben lassen?
Du kannst dir ja mal die Headerfiles anschauen, die beim Compiler dabei sind. Vielleicht bringts dir ja was. Wenn dort irgendwo steht
#define CIPHERLAB_OS
dann... tja, was dann?
-
...nerv ich euch nicht mehr...
Aber ich bin jetzt zuhause und kann erst morgen wieder schauen.
-
Nutz die Zeit Zuhause um C zu lernen. Dir fehlt elementares Grundwissen.
-
Mach ich schon, keine Sorge. Nur konnten mir gerade die Bücher keine Antwort auf diese Frage geben. Aber ich muss es beruflich jetzt sofort anwenden und bis auf diese Frage, kapier ich genug um mein Programm zu beenden. Den Rest lerne ich schon. Versprochen. Und solang danke für die Unterstützung in meinen Wissenslücken...
-
http://de.cipherlab.com/catalog.asp?CatID=7&SubcatID=93&ProdID=268&view=features schrieb:
Mit der Power Suite von CipherLab erstellen Sie benutzerdefinierte Anwendungen:
FORGE Application Generator einschließlich OCX-Modul zur Datenübertragung, STREAM Wireless Studio, MIRROR Terminal Emulation, BLAZE C Compiler und BASIC Compiler.Der Compiler bringt sicher seine eigene Dokumentation mit. Wenn du wissen willst, was da für Bibliotheken dabei sind, ist das ein guter Anlaufpunkt.
Was willst du eigentlich wissen?
-
Welches OS auf dem Gerät läuft damit ich weiter Bibliotheken suchen. Ziel wäre, ohne ein Zwischenprogramm auf einem anderen PC, aus Oracle DB7 und MySQL auszulesen. Idealer eine ODBC Bibliothek. Davon gibt es viele und in vielen Variationen. Jetzt diskutieren wir ob es (was ich mittlerweile befürchte) ein eigens entwickeltes OS auf dem Gerät läuft, oder was verbreitetes...
-
Mitgelieferte Dokumentation lesen. So einfach ist das.
-
mngbd schrieb:
Was willst du eigentlich wissen?
Ich fürchte hier liegt ein Fall vor, wo der Fragesteller zu wenig über Programmierung weiß, sowohl um eine passende Frage zu stellen, als auch um überhaupt die Antworten zu verstehen die ihm gegeben wurden (und die mehr oder weniger zu dem passen, was er vermutlich meint). Daher ist ein bisschen Detektivarbeit angesagt:
Was wir wissen:
- Der Fragesteller will ODBC benutzen
- Die ODBC-Bibliothek selbst beinhaltet auch Binärpakete, die natürlich nicht plattformunabhängig sind
- Es gibt aber auch Sourcecode für die Binärpakete
- Der Threadersteller kennt das Zielsystem nicht
- Der Threadersteller hat einen Compiler für das Zielsystem
Folgerung:
- Der Threadersteller will das Betriebssystem wissen, weil er sonst nicht weiß, welches Binärpaket er runterladen soll
- Das eigentliche Ziel des Threaderstellers ist es, auf seinem unbekannten System ein Programm zum Laufen zu bekommen, dass Funktionen aus der ODBC-Bibliothek verwendet
Lösungsvorschlag:
- Sourcecode der Bibliothek runterladen, selbst compilieren.
- Hoffentlich versteht der Threadersteller diesen Vorschlag und wird nicht gleich wieder unhöflich.
-
p1royal2 schrieb:
Jetzt diskutieren wir ob es (was ich mittlerweile befürchte) ein eigens entwickeltes OS auf dem Gerät läuft, oder was verbreitetes...
Naja, sowas wie die üblichen Unix-Systeme ist vielmehr ein Baukasten als das, was du vielleicht von einem Betriebssytem erwartest. Nur vom Namen her kann man mit sowas auch nicht sagen, ob es dieses oder jenes Feature anbietet. Egal, wie gut du nun C kannst, musst du dich jedenfalls durch die Dokumentation wühlen, ich schätze nicht, dass es allzu viele fertige Software gibt, die genau für dieses Gerät entwickelt wurde.
Ich hab immer noch keine Ahnung, was genau du damit eigentlich anstellen willst (ausser dass es auch mit Sockets und einem Webserver gehen könnte). Falls ich nichts übersehen habe: beschreib das mal genauer.