auf Array von Eltern und Kindprozess zugreifen
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Schau da mal drüber:
http://beej.us/guide/bgipc/
-
Wenn du die Liste vor dem fork füllst,
dann kannst du danach in beiden Prozessen (lesend) zugreifen.Wenn du schreibst,
dann 'sieht' diese Änderung der jeweilige andere Prozess nicht.
In diesem Fall, wäre dann Interprozess Kommunikation, pipes, mmap, ...
und Serialisieren erforderlich.Gruß Frank
-
@Frank Das Problem ist, dass die ncurses Oberfläche blockiert ist:
Endlosschleife ncurses:
void run(){ int key; while ((key = getch()) != 'q') { switch(key){ case KEY_F(1) //mach was ... break; case .... } } }
Der Prozess für die Oberfläche kann nicht auf andere Events (z.B. update) reagieren, da er auf die Usereingabe wartet. Aus diesem Grund gibt es einen 2. Prozess welcher die Liste updaten soll, leider benötige ich die aktuelle Liste auch im ncures-Prozess, da diese dargestellt werden soll.
Die Frage ist nun: Welche Alternativen gibt es?
Evtl. könnte ich Threads statt fork benutzen? (dann aber sicher aufwendige Synchronisierung) oder versuchen ein Signal an den ncurses-Prozess zu senden, damit dieser ein update durchführt und sich die aktuelle Liste (mittels IPC) holt?
-
Warum überhaupt 2 Prozesse, bzw. eventuell Threads ?
Ich glaube hier liegt das Problem ...
Gruß Frank
-
Ich möchte die Oberfläche von einem anderen Prozess updaten. Dazu verwende ich einen separaten Prozess welcher von einem shared memory die aktuellen Daten liest/schreibt.
Da die Oberfläche blockiert ist, kann diese nicht gleichzeitig auf ein "update von außerhalb" warten. Aus diesem Grunde der separate Prozess, welcher neue Daten von außerhalb liest/schreibt und die Liste aktualisiert.
-
Tätest du dich da nicht mit einem Update-Thread für die Daten leichter als einen separaten Prozess zu nehmen? Bei mehreren Prozessen: InterProzess-Com. oder den Array ebenfalls in einem Shared-Memory-File hinterlegen.
Aber ich empfehle ebenfalls den Einsatz von Threads!Gruß Kimmi
-
Typischerweise kann man auch 'non blocking' Funktionen aufrufen
oder sich mit select auf mehrere Ereignisse (file discriptoren) gleichzeitig suspendieren und dann z.B. erst, wenn es sich lohnt getch aufrufen.Ich kenne ncurses nicht wirklich kann mir aber schlecht vorstellen,
das soetwas nicht geht ...Das ist m.e. deutlich einfacher ...
Aber mache das wie du das willst ...
Gruß Frank
-
@Frank Nicht blockierende Funktionen wären mir auch lieber, da sich dann alles schöner aufräumen lässt (z.b beim beenden). Allerdings ist ncurses für meine Begriffe recht eigensinnig und ich möchte deswegen ungern die funktionierende Oberfläche umbauen.
Habe jetzt aber mal einen Thread für die Aktualiserung erstellt und bis jetzt schaut das ganze gut aus. Die Synchronisierung lässt sich auch beispielsweise mit mutex(en) leichter händeln als gedacht.Danke nochmal für alle Tipps
-
Du kannst auch mit nodelay() bzw. timeout() getch dazu bringen nicht zu blockieren!