Hallo,
Es gibt nicht nur RPC! Was ist z.B. mit irgendwelchen Update Nachrichten (Maus-Position, Tastendruck, Dateisachen).
Ich zitiere mich eher ungern, dennoch:
Für solche Dinge solltest du eher eine eigene API bereitstellen, nach der eine Anwendung sich für bestimmte Ereignisse (Events, d.h. keine RPC-Nachrichten) registriert bzw. registrieren muss, damit dann die Nachrichten zugestellt werden können.
Oder anders ausgedrückt: RPC-Nachrichten (synchron, Frage-Antwort-Spielchen) werden von Events (asynchron, plötzlich passiert etwas) getrennt. Beide Systeme existieren parallel.
Ja dafür registrierst du dich, aber um dann eine Nachricht zu bekommen, brauchst du einen Port (und ein Port heißt nicht das man auch einen Service zur Verfügung stellt!).
Wenn beide Systeme parallel laufen, gibt es Port für synchrones RPC und asynchrone Events.
Wer Client und wer Server ist, ist doch egal.
Ist es nicht. Der Client (z.B. die Anwendung) fragt den Server (z.B. das Dateisystem) nach etwas (z.B. einer Datei). Dazu benutzt er einen wohlbekannten Port des Servers, der dann das Ergebnis nicht als Nachricht zurückschickt, sondern - da es ein synchrones Verhalten ist - einfach antwortet.
Als Bsp. der Storage-Server ist für ein normales Programm ein Server, aber wenn der Storage-Server eine Anfrage an einen Treiber macht, ist er Client, also bringt die Unterscheidung erstmal gar nichts.
Das ist Blödsinn. Der Storage-Server ist ein Server (darum heißt er so), er stellt für Anwendungen einen RPC-Port zur Verfügung. Dass er dazu auf andere Prozesse zugreift, spielt in der Betrachtung überhaupt keine Rolle! Um ein RPC-Client zu sein, muss man keine Voraussetzungen (mal abgesehen von Permissions) erfüllen!
Deswegen betrachte ich immer Ports, wer die benutzt ist doch egal.
Nein, ist es nicht. Synchrones RPC funktioniert so, dass du weißt, wer den Service anbietet und wer nicht.
Eine einfache Konsolen-Anwendung, die kein Fenster hat, wird also auch keinen Port brauchen, kann also auch keine unaufgeforderten Nachrichten bekommen.
Ebenfalls Blödsinn. Auch eine Konsolenanwendung ohne Fenster wird Ereignisse abkriegen. Die Umgebung kann sich z.B. ändern (du kannst auch im Textmodus die Auflösung ändern, z.B. von 80x25 auf 80x43 oder so), das Programm kann ein Signal bekommen, dass es die Konfiguration neu einlesen soll (SIGHUP) oder sich beenden soll (SIGTERM).
Ich zitiere mich ungern:
Und nimm bitte Fenster aus der Betrachtung raus.
Die haben mit RPC nichts zu tun, sondern sind einzig und allein Aufgabe des GUI-Servers. Der Kernel soll graphische Anwendungen, egal wieviele Fenster sie haben, als
Anwendung begreifen, nicht als Ansammlung von Fenstern! Ob die Anwendung dann jedem Fenster einen RPC-Port zuweist oder ob sie einen Dispatcher benutzt, um die Ereignisse auf die Fenster zu verteilen, ist doch total egal.
Nicht jede graphische Anwendung hat ein Fensterkonzept, welches du kennst (Spiele im Vollbildmodus machen das oft selbst). Und wenn du deinen Kernel auf den GUI-Server hin exakt zuschneidest, dann meißelst du dein Fensterkonzept in Stein!
Ein anderes Bsp. wäre, das meine Anwendung darüber informiert werden will, wenn etwas an einer bestimmten Datei etwas ändert. Auch dafür braucht die Anwendung dann wieder einen Port, damit dorthin die Nachricht das sich etwas geändert hat, geschickt werden kann.
Ja. Das ist aber
nicht vergleichbar mit den Ports, die du für Anfragen benutzt! Was an diese Adresse geschickt wird, sind asynchrone RPC-Nachrichten, oder von mir als "Events" bezeichnet.
Ich würde das nicht über die gleiche API laufenlassen, siehe oben.
Was die API betrifft, diese soll ja dann einen Port pro Fenster nutzen. Das kann man ja alles vor dem Programmierer verstecken, aber trotzdem muss es erstmal implementiert werden.
Löse dich von Fenstern. Das ist Unfug. Du hast einfach nur Threads.
Und trenne synchrones RPC (Client-Server-Architektur) von asynchronem RPC (Events).
Gruß,
Svenska