Wie öffnet man ein vorhandenes benanntes Semaphor?

Wie öffnet man ein vorhandenes benanntes Semaphor?

Offensichtlich sind O_CREATund O_EXCLbeim Öffnen eines vorhandenen Semaphors nicht erforderlich.

O_CREATwird beim Erstellen eines neuen Semaphors benötigt.

O_EXCList nur in Verbindung mit ODER sinnvoll O_CREATund gibt an, dass ein Fehler zurückgegeben wird, wenn bereits ein Semaphor mit dem angegebenen Namen vorhanden ist.

Linux-Handbuchseite für sem_opensagte, dass

Definitionen der Flagwerte erhalten Sie durch Einbinden von <fcntl.h>

aber ich habe keine Flagge gefunden infcntl.hdas hat mir gesagt, wie ich ein vorhandenes Semaphor öffnen kann.

Antwort1

Betrachten Sie das folgende Beispiel:

#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    const char* const sem_name = "lock.sem";

    if (argc == 1) {
        sem_t* const sem = sem_open(sem_name, O_CREAT, 0644, 0);

        if (sem == NULL) {
            perror("sem_open");
            return 1;
        }

        sem_wait(sem); // Will block
        sem_close(sem);

        sem_unlink(sem_name);
    } else {
        sem_t* const sem = sem_open(sem_name, 0);

        if (sem == NULL) {
            perror("sem_open");
            return 1;
        }

        sem_post(sem); // Will unblock the other process
        sem_close(sem);
    }

    return 0;
}

Ich verwende die Argumentanzahl, um das Verhalten des Programms zu steuern.

Wenn ich keine Parameter angebe (d. h. wenn argc == 1), öffnet das Programm das Semaphor und erstellt es, wenn es noch nicht vorhanden ist; es initialisiert den Wert des Semaphors auf 0. Dann führt es eine sem_wait()auf dem semObjekt aus. Da das Semaphor auf initialisiert wurde 0, führt dies zu einer Blockierung des Prozesses.

Wenn ich nun eine zweite Instanz desselben Programms ausführe, diesmal jedoch mit einer beliebigen Anzahl von Argumenten ungleich Null (d. h. wenn argc != 1), öffnet das Programm das Semaphor, erstellt es jedoch nicht, wenn es noch nicht vorhanden ist. Beachten Sie hier, dass ich 0für den oflagParameter übergebe (d. h. ich übergebe keine Flags). Das Programm führt dann einen aus sem_post()und erhöht das Semaphor von 0auf 1. Dadurch wird der erste Prozess entsperrt. Beide Prozesse schließen ihre Referenzen auf das Semaphor und werden beendet.

Wenn ich Ihre Frage richtig verstehe, suchen Sie nach dem zweiten Fall.

Wenn ich versuche, zuerst den zweiten Fall auszuführen (d. h. wenn keine Instanz des ersten Falls ausgeführt wird), erhalte ich Folgendes:

$ ./a.out foo
sem_open: No such file or directory

Dies liegt daran, dass beim Aufruf perror()kein Semaphor mit dem angegebenen Namen existiert.

verwandte Informationen