Prozessübergreifende Semaphore sind eine betriebssystemspezifische Operation.
die meisten dieser Aktien Was ist, dass Sie die Semaphore in einem Prozess über einen virtuellen Pfad erstellen , die als der Name des Semaphore Dubs. Wenn Berechtigungen richtig festgelegt sind, können Sie die das Semaphor in einem anderen Prozess öffnen, indem Sie denselben virtuellen Pfad verwenden. Diese virtuellen Pfade sind normalerweise keine echten Dateisystempfade, selbst wenn sie Ihnen bekannt vorkommen.
Auf POSIX/System V-basierten Systemen haben Sie normalerweise zwei Optionen. Die Unterschiede zwischen den beiden Optionen sind in this answer sehr gut erklärt.
System V Semaphore
Dies sind pfadbasierte Semaphore, die mit semget()
erhältlich:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int sem;
int sem_id = 1;
key_t key;
key = ftok("/virtualpathtosemaphore", 1);
// create a new semaphore
sem = semget(key, 1, IPC_CREAT);
// use sem = semget(key, 1, 0); to attach to an existing semaphore
// flags also contain access rights, to take care to set them appropriately
// increment semaphore
struct sembuf semopinc = {
.sem_num = 0,
.sem_op = 1,
.sem_flg = 0
};
semop(sem, &semopinc, 1);
/* decrement semaphore, may block */
struct sembuf semopdec = {
.sem_num = 0,
.sem_op = -1,
.sem_flg = 0
};
semop(sem, &semopdec, 1);
Beachten Sie, dass es zur Reinigung wichtig ist die Semaphore, als System-V-Semaphore um bleiben, bis explizit nicht verknüpft Was ist ein Problem, wenn ein Prozess abstürzt, ohne seine Semaphore zu bereinigen (z. B. FreeBSD kommt mit einem Dienstprogramm ipcrm
entfernen Sie baumelnde System V IPC-Objekte).
POSIX Semaphore
Diese sind weniger tatsächlich weitgehend umgesetzt, so überprüfen Sie, ob Ihr Kernel unterstützt werden. Die benannte Version von diesen ist erhalten über sem_open()
.
POSIX-Semaphoren werden implizit zerstört, wenn der letzte Prozess mit einem Handle zum Semaphor beendet wird. Sie werden gemunkelt, seine eigene Semaphore APIs schneller zu sein als
Semaphore System V Windows-
Windows verfügt über: Semaphore werden von CreateSemaphore()
erstellt.
Windows verwendet den gleichen Namenstrick als POSIX, aber mit anderen Namespace-Konventionen.
HANDLE hSem;
hSem = CreateSemaphore(NULL, 0, LONG_MAX, _T("Local\\PathToMySemaphore");
// Use OpenSemaphore() to attach to an existing semaphore
// increment semaphore:
ReleaseSemaphore(hSem, 1, NULL);
// decrement semaphore
WaitForSingleObject(hSem, 0);
Vergessen Sie nicht, die Fehlerüberprüfung hinzuzufügen, wenn Sie die obigen Beispiele anpassen.Beachten Sie außerdem, dass ich die Berechtigungen zur Vereinfachung des Codes bewusst ignoriert habe. Vergessen Sie nicht, die entsprechenden Flags hinzuzufügen.
Zusätzlich zu all dem können Sie auch (wie häufig vor der Ankunft von echten Semaphoren üblich) Missbrauch von Dateisperren als eine Form von binärem Mutex verwenden.
Welches Betriebssystem verwenden Sie? Wenn es, wie Linux, Semaphore hat, die zwischen Prozessen verwendet werden können, benutzen Sie das einfach. –
Ich mache das auf UBUNTU –
@AbhishekGangwar - Fragen Sie vor allem, wie Sie den zweiten Prozess wissen lassen, was ist die ID des gemeinsamen Speichers? –