• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] EreignisPRT, ErrorIDs, Shared-Memory-Dateisystem

Hallo lieber Linux-Freunde,

ich bin hier noch neu und habe mit Linux eigentlich fast nie etwas zu tun gehabt. Ich habe die letzten 10 Jahre in einer Firma als Programmierer (unter Windows) gearbeitet. Mittlerweile arbeite ich nicht mehr in dieser Firma. Daher ist der Hintergrund dieses Thema nicht kommerziell. In den letzten drei Jahren erkannte ich dann so langsam, was hier fehlt: ein nicht improvisiertes Ereignisprotokoll.
Im Laufe dieser drei Jahre ist dieses Konzept nun immer mehr gewachsen und nun stelle ich mir die Frage, ob so etwas nicht eigentlich in das Betriebssystem gehört. Das Ziel ist es, sofern der Programmierer an eine Fehlerquelle gedacht hat, dort auftretene Fehler auch immer mit korrektem Sachbezug anzuzeigen. Hier mal eine kurze Beschreibung meiner Idee:
Es wird ein kleines Shared-Memory-Dateisystem implementiert, zu dem der Anwender prinzipiell keinen direkten Zugang erhält. Dadurch können dann in den Pfaden Binärzeichen als Steuerzeichen verwendet werden. Dies ist wichtig, damit man dem Anwender keine Einschränkungen bei der Zeichenwahl für solche Felder wie Auftragsname, Teilename usw. auferlegen muß. Dieses Dateisystem dient nur der Speicherung sicherungstechnisch noch nicht relavanter Daten. Ereignisse sind darin dann Dateien (oder Blätter) und der ErrorCode ist der Dateiname. Solche Dateien sind dann Dateien eines ganz speziellen Typs. Es können in diesem Dateisystem natürlich auch Dateien anderen Typs abgelegt werden. Die Objekte, die der Anwender/Supporter kennt, sind dann die Verzeichnisse. In einer gesunden Firma mit einem vorhandenen Application-Framework stellt dieses dann die programminterne Seite und dieses Dateisystem mit seinen Meldungen die programmexterne Seite des Software-Systems dar. In diesem Dateisystem hat jeder Thread dann ein CurrentDir, wo er gerade in diesem Dateisystem steht. Das Programm muß sich dann in diesem Baum entsprechend der gerade bearbeiteten Daten mit relativen/absoluten Sprüngen bewegen. Dies läuft dann ähnlich dem cd-Befehl von DOS.
Zu jeder Datei dieses Dateisystems gibt es dann immer einen Absender, der diese Datei angelegt hat. Dieser Absender steht mit den Threads dann in einer 1-1-Beziehung. Dieser Absender wird erst mit dem Löschen der letzten von ihm stammenden Datei gelöscht. Er überlebt also die Terminierung des Threads/Prozesses.

Der ErrorCode besteht in meinem Konzept dann aus folgenden Informationen:
Ereignistyp: Fehler, Warnung oder Information
Codesystem: eine ID, die die Integration unterschiedlicher ErrorCode-Systeme verschiedener Firmen/Software-Systeme ermöglichen soll.
Vorzeichen: Das Vorzeichen des ErrorCodes; manche Firmen/Software-Systeme verwenden negative ErrorCodes
Module-ID: Die ID des Moduls, zu dem der ErrorCode gehört (1-basiert).
Class-ID: Die ID der Klasse (1-basiert)
ID: dies ist dann nur noch eine ID innerhalb der Klasse (1-basiert).
Je nach Implementierung eines Codesystems können die letzten drei Felder auch als ein einziges Feld zusammengefaßt werden, in dem dann der absolute ErrorCode gespeichert ist. Dieses dreistufige ID-System soll einfach nur eine leichte Programmierung ermöglichen. Da als ErrorCode aber nur ein 32-Bit-Integer zur Verfügung steht, werden diese ganzen Felder als Bitdatenfelder in C deklariert.

Um dieses Dateisystem nun in das Betriebssystem integrieren zu können, müßte jedes Programm seine eigenen statischen Tabellen, über die den ErrorCodes ein Text zugeordnet werden kann, im Betriebssystem registrieren können. Der zurückgelieferte Zugriffscode für diese Tabellen muß dann im Feld CodeSystem abgelegt werden. Um die Menge der dynamisch erzeugten ErrorCodes gering zu halten, reserviert man in diesem Codesystem dann einige spezielle Werte für das Betreibssystem und für den Hersteller, der das EXE und die dazugehörigen Bibliotheken vertreibt. Auch für Standard-Bibliotheken wie C-Runtime und ähnliches kann man wohl feste Werte reservieren. Die dynamisch erzeugten ErrorCodes haben dann nur für Hersteller von speziellen Bibliotheken Bedeutung (z.B. Combit). Dies alles wird mit einem 32-Bit-ErrorCode wohl nur unbefriedigend zu realisieren sein. Ein 64-Bit-ErrorCode hingegen sollte dafür problemlos ausreichen.

Das Ziel dieses Konzepts ist es, nur noch eine einzige Ausgabe-Adresse für Meldungen zu haben. So war es ja bis in die 70er Jahre. Durch das Aufkommen grafischer Oberflächen ist diese Konsole als Ausgabeadresse für die Programme inakzeptabel geworden. In der Firma, wo ich gearbeitet habe, gibt es bis zu sechs Ausgabeadresse, die teilweise sehr speziell sind. Die einzigen universellen Ausgabeadressen sind die LOG-Datei und die Konsole, die ja unter Windows je nach Art der Anwendung (Konsolenanwendung) angezeigt wird.

So wie ich das bisher beobachtet habe, haben dieses Problem eigentlich alle Software-Systeme, mit denen ich bisher zu tun hatte. Windows gibt auch immer nur ErrorCodes als einfachen Integer-Wert zurück und der Sachbezug zum ErrorCode fehlt auch machesmal. Auch hat Microsoft mehrere inkompatible ErrorCode-Systeme (GetLastError, ODBC-ErrorCodes) in Verwendung. Gleiches gilt für List&Labels (ein Reporting-Tool) von Combit. Und in der Linux-Welt sieht es meines Wissens nach auch nicht so viel besser aus. In den Vorlesungen zu Betriebssysteme an der UNI Bremen sah das Vorgehen im Fehlerfall auch eher dem von Microsoft ähnlich. Und was die Konsequenz eines solchen Vorgehens ist (einfach eine fortlaufend durchnummerierte ID), ist klar: wenn man einen Fehlerfall nicht auf richtiges Verhalten hin überprüft hat und diese Möglichkeit eher zu den selten vorkommenden Fällen gehört, so wird der Anwender mit Meldungen der Art "Fehler: 0x34535" usw. immer wieder konfrontiert werden. Bei Sun's "VirtualBox" hatte ich vor kurzem eine solche Situation. Und vor ca. 10 Jahre hatte ich auch mal in einem Buch von einer ähnlichen frustrierenden Meldung eines Programms gelesen.

Dieses Konzept habe ich in einer Dokumentation, die fast 1MB umfaßt, detailierter beschrieben.

Wenn jemand mit dem hier gesagten nichts oder nur wenig anfangen kann, aber jemanden kennt, der sich dort auskennt, so bitte ich um Vermittlung. Wenn jemand ein Forum kennt, das besser für diesen Beitrag geeignet ist, hätte ich gerne die Adresse.
 

Jägerschlürfer

Moderator
Teammitglied
ich versteh grad nicht, worauf du hinaus willst. Vielleicht liegts aber auch noch an den frühen Morgenstunden,....

bei Linux hast du doch eigentlich alle Log Dateien in dem Ordner /var/log. Dort wird doch alles protokolliert und wenn du ein Programm hast, das nicht richtig startet, kannst du dieses aus der Konsole heraus starten und schon bekommst du eine entsprechende Fehlermeldung,...
Was soll hier also noch geändert werden? Die Logs liegen ja eigentlich schon alle in einem Verzeichnis,...
 
Dies ist eigentlich eher ein Beitrag für Programmierer, die im Idealfall sogar an der Linux-(Kernel)-Entwicklung beteiligt sind. Bei der Verwendung von LOG-Dateien besteht immer das Problem, daß grafische Oberflächen dabei schlecht wegkommen. Auch geht es hier nicht um manuell ausgeführte Programmaufrufe, sondern um mehrere hintereinander ablaufende automatisierte Programmaufrufe. Dabei sollen dann aber trotzdem noch alle Informationen gebündelt und in einer grafischen Oberfläche angezeigt werden. Auch soll die Arbeitsaufteilung eines Software-Systems vor dem Anwender verborgen werden (wird eine Aufgabe nun durch ein oder zwei Programmaufrufe erledigt). Dies ist bei der Verwendung von LOG-Dateien eigentlich niemals gegeben.
Ein Student, der gerade sein Studium abgeschlossen hat, und in der o.g. Firma vor kurzem eingestellt wurde, hat sich meine Problembeschreibung und Lösung durchgelesen, und gesagt, daß ich den Nagel da ja genau auf den Kopf getroffen habe. Auch habe ich während meines UNI-Besuchs als Gasthörer (ich habe keine allgemeine Hochschulreife) mit mehreren Studenten darüber geredet und meine Doku auch einem Prof. gegeben. Vom Prof. habe ich allerdings keine Rückmeldung erhalten.
Auch und bzgl. der zum normalen Dateisystem des Betriebssystems entstehenden Konkurenz: dies war so anfangs nicht geplant und hat sich im Laufe der Zeit ergeben. Weiterhin entsteht diese Konkurenz auch nur bei temporären Laufzeitdaten, die (noch) keine sicherungstechnische Bedeutung habe.
Das normale Dateisystem kann aus diversen Gründen nicht verwendet werden:
-Geschwindigkeit: all diese Operationen auf der Festplatte auszuführen, wäre viel zu langsam; und eine Memory-Disk kann man als Software-Hersteller
seinen Kunden nicht einfach aufzwingen.
-ASCII-Zeichen als Steuerzeichen im Pfad (/ unter Linux oder \: unter Windows): dies bringt das o.g. Problem mit sich, daß der Anwender diese Zeichen in
Feldern wie Auftragsname und ähnlichen nicht verwenden darf.
 
Ein Datenbanksystem ist da wohl eher geeignet. In der Datenbank bildet man die Relationen (Beziehungen) der Daten ab, z.B. per Nested Sets oder sonstigen Bäumen. Ein Shared memory Dateisystem gibt es nicht.
 
Datenbanken lösen zwar das Shared-Memory-Problem. Und sicherlich kann man mein Ziel auch über Datenbanken, genauso wie auch über das reguläre Dateisystem, erreichen. Die Geschwindigkeit wird dann aber unerträglich sein. Und das es so ein Shared-Memory-Dateisystem bisher nicht gibt, habe ich auch schon festgestellt.

Ich will aber eigentlich nicht über solche fundamentalen Dinge diskutieren. Kennt einer von euch ein deutsch-sprachiges Linux-Entwickler-Forum oder einen Linux-Entwickler?
 
Deine erste Anlaufstelle sollte die Kerneldoku über Dateisysteme und http://kernelnewbies.org/ sein. Um Englisch wirst du allerdings nicht herum kommen.

http://news.opensuse.org/2009/04/23/people-of-opensuse-jan-engelhardt/

http://www.cplusplus.com/forum/unices/
http://www.linuxquestions.org/questions/programming-9/
http://www.programmersheaven.com/mb/Linux/Board.aspx
http://www.linuxforums.org/forum/programming-scripting/
http://cboard.cprogramming.com/linux-programming/
 
Danke für diese Antwort. Ich habe schon ein wenig auf die Seiten geschaut. Daher hat die Antwort so lange auf sich warten lassen. Da ich in der Schule in Englisch auf der Realschule immer nur eine 5 hatte, wird das wohl aber nicht so leicht, dort mit den anderen zu kommunizieren.
Aber trotzdem vielen Dank.

Ich habe keine Möglichkeit gefunden, dieses Thema nun abzuschliessen. Sonst hätte ich es getan.
 
Oben