Offensichtlich sind O_CREAT
und O_EXCL
beim Öffnen eines vorhandenen Semaphors nicht erforderlich.
O_CREAT
wird beim Erstellen eines neuen Semaphors benötigt.
O_EXCL
ist nur in Verbindung mit ODER sinnvoll O_CREAT
und 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 sem
Objekt 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 0
für den oflag
Parameter übergebe (d. h. ich übergebe keine Flags). Das Programm führt dann einen aus sem_post()
und erhöht das Semaphor von 0
auf 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.