Semaphoren in mehreren Prozessen

Guten Morgen!

Ich habe folgendes Problem:
Programmierung WinAPI über C++

Ich erzeuge drei Prozesse:

  1. Prozess erzeugt die zwei Semaphoren(CreateSemaphore), die beiden anderen Prozesse (CreateProcess)
    und einen Ringpuffer den ich mittels FileMapping an die beiden anderen Prozesse übergebe.
  2. Erzeugerprozess
  3. Verbraucherprozess

Ich weiß wie ich mit Semas innerhalb eines Prozesses mit mehreren Threads umgehen kann(Erzeuger-Verbraucher-Problem innerhalb eines Prozesses habe ich schon programmiert!)… aber ich weiß nicht, wie ich mit Semas über mehrere Prozesse umgehen muss, geschweige denn, wie ich den Ringpuffer per FileMapping übergeben muss.

Mein 1. Prozess meldet keine Fehler meine beiden anderen Prozesse
melden exakt 11 Fehler(ziemlich ähnliche):

process2.cpp(22) : error C2065: ‚r_buffer‘ : nichtdeklarierter Bezeichner
process2.cpp(22) : error C2065: ‚ring‘ : nichtdeklarierter Bezeichner
process2.cpp(22) : error C2440: ‚=‘ : ‚struct main::r_buffer *‘ kann nicht in ‚int‘ konvertiert werden. Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
process2.cpp(25) : error C2065: ‚flag‘ : nichtdeklarierter Bezeichner
process2.cpp(25) : warning C4805: ‚==‘ : unsichere Kombination von Typ ‚int‘ mit Typ ‚const bool‘ in einer Operation
process2.cpp(27) : error C2065: ‚voll‘ : nichtdeklarierter Bezeichner
process2.cpp(28) : error C2227: Der linke Teil von ‚->buffer‘ muss auf Klasse/Struktur/Union zeigen
process2.cpp(28) : error C2227: Der linke Teil von ‚->nextFull‘ muss auf Klasse/Struktur/Union zeigen
process2.cpp(29) : error C2227: Der linke Teil von ‚->buffer‘ muss auf Klasse/Struktur/Union zeigen
process2.cpp(30) : error C2227: Der linke Teil von ‚->nextFull‘ muss auf Klasse/Struktur/Union zeigen
process2.cpp(30) : error C2227: Der linke Teil von ‚->nextFull‘ muss auf Klasse/Struktur/Union zeigen
F:\BS\WORK_UB6\process2\process2.cpp(31) : error C2065: ‚leer‘ : nichtdeklarierter Bezeichner

leer ist Sema1, das ich mit dem Erzeugerprozess fülle (voll ist das Gegenstück).
nextFull zeigt mir den nächsten freien Platz im Puffer an
und nextEmpty den nächsten Leeren.
Die Handles, den Puffer und das flag habe ich außerhalb der main-Schleife im ersten Prozess erzeugt und dachte, das würde genügen um damit in den anderen Prozessen handeln zu können. Leider ist dem nicht so. Wie übergebe ich also diese Bauteile?

Bevor ich hier den ganzen Code rein setze frage ich lieber erst mal
nach, ob man aus den obigen Angaben eine Hilfestellung geben kann.

Ich bedanke mich jetzt schon für jede Hilfe!

GrüsSE San Sebastian

Grüß Dich Sebastian,

r_buffer’ : nichtdeklarierter Bezeichner

ist der erste Fehler, der ist immer am Interessantesten.

Das bedeutet ganz einfach: r_buffer ist ist wohl irgend ein struct. Dein Code ist auf mehrere Dateien aufgeteilt und dort, wo dieser Fehler angezeigt wird, ist der struct nicht bekannt. Am besten bastelst Du Dir also einen Header, wo das ganze deklariert wird, und inkludierst ihn überall, wo Du ihn brauchst (also mindestens da, wo er momentan deklariert ist, und in der Datei, wo es den Fehler gab). Idealerweise sorgst Du mit Präprozessordirektiven noch dafür, dass der Header nicht mehrmals eingebunden wird (kann sonst weitere unschöne Fehler geben).

Unter Windows hab ich noch keine Semaphoren programmiert. Vermutlich hast Du aber einen Zeiger auf irgend nen Speicherbereich, der den Semaphor beschreibt, oder eine „Semaphoren-Variable“. Die muss dann vermutlich auch in allen Modulen bekannt sein.

Ich hoffe, das hilft schon ein wenig.

Hallöchen Karre!

Danke für die Antwort, aber das will ich nicht. Header-Datei ist einfach, aber nicht gewollt. Deshalb versuche ich es mit FileMapping.

Schade dass sich da keiner für mich auskennen will.

Grüsse SanSebastian

Hallo SanSebastian,

Danke für die Antwort, aber das will ich nicht. Header-Datei
ist einfach, aber nicht gewollt.

Wieso nicht ??

Du hast eine Struktur, welche an eine andere Applikation weitergeben wird.
Dazu muss diese Struktur aber beiden Applikationen bekannt sein.
Mir sind dazu nur 3 Möglichkeiten bekannt:

  1. du erstellst eine Header-Datei, welche in beide Applikationen eingebunden wird. Dies hat den Vorteil, dass du Änderungen nur in einer Datei vornehmen musst.

  2. Du Deklarierst diese Struktur einfach in jedem der Programme. Bei Änderungen musst du halt einfach bei allen Programmen die Änderungen durchführen sonst suchst du den Bug …

  3. Du baust dir ein Interface zusammen, mit dessen Hilfe die Klienten beim Hauptprogramm die Struktur abfragen können. Wird halt etwas Aufwändig, da du das alles dynamisch verwalten musst.
    Windows verwendet ein solches Interface für ActiveX, COM usw.

MfG Peter(TOO)

Hallöchen Karre!

Danke für die Antwort, aber das will ich nicht. Header-Datei
ist einfach, aber nicht gewollt. Deshalb versuche ich es mit
FileMapping.

Schade dass sich da keiner für mich auskennen will.

Was mich angeht, hast du tatsächlich recht mit deiner letzten Aussage.

Die Compilerfehlermeldungen mit denen Du Probleme hast, zeigen
mir, dass Du noch nie ein Programm selbst geschrieben und
übersetzt hast.
Ich habe keine Lust, das auch noch zu unterstützen, indem
ich irgendwelche fertigen Codeteile hier poste.