Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Shared Memory & Semaphores. Was für eine ID nehme ich? (https://www.delphipraxis.net/90690-shared-memory-semaphores-fuer-eine-id-nehme-ich.html)

yankee 22. Apr 2007 08:43


Shared Memory & Semaphores. Was für eine ID nehme ich?
 
Hi @ll,

ich möchte zwei Prozesse miteinander kommunizieren lassen.
Im Endeffekt solll das ganze unter Linux mit php laufen, aber für das Problem selbst tut es eigentlich nichts zur Sache:

Ich kann mit sem_acquire und sem_release das gleiche bewirken wie in Windows mit der CriticalSection. Dafür muss ich erst mit sem_get(integer) mit eine semid holen. Jeder andere Prozess, der jetzt ebenfalls sem_get(integer) mit dem gleichen integer aufruft erhält die gleiche semid und so haben beide Prozesse die gleiche Semaphore, mit der sie sich schön gegenseitig sperren können.

Aber was für eine Zahl nehme ich als Parameter für sem_get? Wenn irgend ein anderer Prozess zufällig diese id schon hat, dann dürfte ich schliesslich lustige Effekte bekommen, da ein dritter unbekanter Prozess noch in meiner semaphore irgendwas macht.

Olli 22. Apr 2007 10:27

Re: Shared Memory & Semaphores. Was für eine ID nehme ic
 
Unter Linux (*nix allgemein) ist es gaengiger mit Sperrdateien (Lock files) zu arbeiten. So eine Sperrdatei koennte im Uebrigen die PID des "Master-Prozesses" enthalten, wodurch sie dann beiden bekannt ist.

Kritische Abschnitte unter Windows sind uebrigens nur fuer den aktuellen Prozess gueltig. Semaphoren gibt es auch, die haben jedoch ueblicherweise einen Namen. Vorteil gegenueber einem Mutex ist dabei, dass die Semaphore eine Aussage erlaubt, wieviele Clients gerade die eine oder andere Aktion machen. Dadurch kann man den Zugriff der Clients feinkoerniger koordinieren.

yankee 22. Apr 2007 10:37

Re: Shared Memory & Semaphores. Was für eine ID nehme ic
 
Mhhh...

Wenn ich eine Datei verwende habe ich aber doch ein Problem auf das verschwionden der Datei zu warten, oder?

Es geht mir nämlich im Endeffekt darum, dass das eine Skript auf ein Event in einem anderen Script warted. So sleepe ich also genüsslich vormich in bis die sem_release in dem eventauslösenden Thread aufgerufen wurde.
Wenn ich jetzt mit einer while-Schleife auf die Existenz einer Datei warte, dann geht das doch bestimmt entweder stark auf die CPU, oder (bei verwendung von sleep) habe ich ein "lag" drin, bis das event mal ankommt. Oder gibt es da was vergleichbares?

Robert Marquardt 22. Apr 2007 11:47

Re: Shared Memory & Semaphores. Was für eine ID nehme ic
 
Wie ist das Verhaeltnis der beiden Prozesse/Skripte? Erzeugt das eine Daten und das andere verarbeitet sie?
Mach dich auch mal mit Named Pipes vertraut.

yankee 22. Apr 2007 11:56

Re: Shared Memory & Semaphores. Was für eine ID nehme ic
 
Zitat:

Zitat von Robert Marquardt
Wie ist das Verhaeltnis der beiden Prozesse/Skripte? Erzeugt das eine Daten und das andere verarbeitet sie?

Es sind immer 2 Scripte, die zusammenarbeiten...
Wenn es fertig ist, dann soll das ganze ein IRC-Client, der komplett in php und Javascript realisiert ist werden.

Dabei gibt es ein Script, welches auf Endlosschleife läuft und die eigentliche Arbeit des irc-clients macht (also Nachrichten schreiben und empfangen.
Das zweite Script wird vom Browser per AJAX aufgerufen und warted darauf, dass das 1. Script eine Nachricht empfangt. Sobald dies der Fall ist sendet das Script seine Antwort an den Browser und schliesst die Verbindung zum Browser, damit der AJAX-Request komplett ist und der die Daten darstellen kann. Der Browser baut daraufhin die Verbindung zum 2. Script natürlich sofort wieder auf.
Das ganze funktioniert auch schon, aber als semid mit einer Konstante, die ich mal so zufallsmässig definiert habe. So kann ich natürlich nur ein Script gleichzeitig auf dem Server laufen haben, weil die Konstante ja schon in Verwndung ist. Mal abgesehen von bösen Überraschungen, wenn ein weiteres Programm genau die id schon verwendet...


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz