POSIX-Semaphoren mit C-Programmierung

Posix Semaphores With C Programming

POSIX bezieht sich auf das Portable Interface des Betriebssystems, das ein IEEE-Standard ist, der entwickelt wurde, um die Portabilität verschiedener Anwendungen zu unterstützen. POSIX ist ein Versuch, durch eine Zusammenarbeit von Anbietern eine gemeinsame standardisierte Version von UNIX zu erstellen. Es würde die Portierung von Apps zwischen Hardwareplattformen erleichtern, wenn sie effektiv sind. Hewlett-Packard integriert POSIX in sein lizenziertes MPE/iX OS Version 5.0 bzw. HP/UXX Version 10.0 (seine UNIX).

Der POSIX-Standard besteht aus weit mehr als zehn Teilen, zwei sind jedoch leicht erhältlich. POSIX.1 beschreibt C-Programmierschnittstellen (d. h. eine Systemaufrufbibliothek) für Dateien, Prozeduren und E/A-Terminals. Die C-POSIX-Paketbibliothek für POSIX-Plattformen ist ein Framework der C-Standardbibliothek. Dies wird gleichzeitig mit dem Standard ANSI C etabliert. Um POSIX mit dem Standard C konform zu machen, wurden mehrere Versuche unternommen. POSIX bietet zusätzliche Funktionen zu denen, die in Standard C implementiert sind.



POSIX-Semaphoren

Ein Semaphor ist eine Datenstruktur, die häufig verwendet wird, um die Prozesse zu synchronisieren und Threads zu unterstützen, ohne dass deren Interaktion miteinander zusammenarbeitet. Die Schnittstelle für Semaphoren wird durch den POSIX-Standard spezifiziert. Es ist nicht Teil von Pthreads. Die meisten UNIX-Systeme, die Pthreads unterstützen, stellen jedoch sogar Semaphoren bereit. In Unix-ähnlichen Frameworks wie Linux werden Semaphoren mit Nachrichtenwarteschlangen und gemeinsamem Speicher unter den Interprozesskommunikationsdiensten (IPC) zusammengeführt. Die älteren Framework-V-Semaphoren und die modernen POSIX-Semaphoren werden zu zwei Arten von Semaphoren. POSIX-Semaphore-Aufrufe sind so viel einfacher als System-V-Semaphore-Aufrufe. Obwohl System-V-Semaphoren leichter zu bekommen sind, insbesondere auf früheren Unix-ähnlichen Plattformen. Es besteht die Notwendigkeit, Programme, die POSIX-Semaphoren verwenden, mit der Pthread-Bibliothek zu verbinden. Wir werfen einen Blick auf die POSIX-Semaphoren in diesem Artikel.



Warum POSIX-Semaphoren?

Es gibt ein großes Problem mit Threads, nämlich Race Condition. Es ist ein Umstand, in dem zwei Threads versuchen, die gleichen Informationen zu erhalten und zu ändern, wodurch sie widersprüchlich werden. Um eine Race Condition zu vermeiden, verwenden wir seit sehr langer Zeit Semaphoren.



Semaphoren sind in 2 Arten erhältlich:

Binäres Semaphor :

Es wird auch als Mutex-Sperre erkannt. Es hätte nur zwei mögliche Werte, 0 und 1. Der Wert wird als 1 initialisiert. Er wird verwendet, um zahlreiche Prozesse zu erzwingen, um das schwerwiegende Abschnittsproblem zu lösen.



Semaphore zählen :

Seine Größe kann innerhalb einer uneingeschränkten Domäne variieren. Es wird verwendet, um die Autorität über den Zugriff auf Ressourcen mit zahlreichen Instanzen zu haben.

Das Linux-POSIX-Framework hat sein integriertes Semaphore-Repository. Um es zu verwenden, müssen wir:

  • semaphore.h . hinzufügen
  • Stapeln Sie den Code, indem Sie sich mit -lpthread -lrt verbinden.

Fast alle POSIX Semaphore-Methoden und -Formulare sind prototypisch oder in „Semaphore.h“ spezifiziert. Wir verwenden den Semaphor, um eine Entität oder ein Objekt zu beschreiben als:

>>sem_t sem_name;

Hier sind verschiedene Funktionen, die wir in POSIX Semaphore verwenden würden.

Semi_init

Um einen Semaphor zu initialisieren, müssen Sie die Methode sem_init verwenden. In dieser Funktion entspricht sem einem initialisierten Semaphor-Objekt. Pshared ist ein Banner oder Flag, das angibt, ob der Semaphor mit einer forked()-Prozedur geteilt werden kann oder nicht. Gemeinsam genutzte Semaphoren werden derzeit nicht von LinuxThreads unterstützt. Der Argumentwert ist der Startwert, auf den das Semaphor fixiert wird.

>> intsem_init(sem_t*halb, intgeteilt, ohne Vorzeichen intWert);

Sem_wait

Wir werden die sem-wait-Methode verwenden, um einen Semaphor zu halten/zu sperren oder ihn warten zu lassen. Wenn das Semaphor mit einem negativen Wert versehen wurde, wird der Aufrufzyklus automatisch gesperrt. Immer wenn ein anderer Thread sem_post aufruft, erwacht einer der bereits blockierten Prozesse.

>> intsem_wait(sem_t*halb);

Sem_post

Wir verwenden die Methode sem_post, um den Wert eines Semaphors zu erhöhen. Beim Aufruf inkrementiert sem_post den Wert und einer der bereits blockierten oder wartenden Prozesse erwacht.

>> intsem_post(sem_t*halb);

Sem_getvalue

Wenn Sie den Wert eines Semaphors wissen möchten, müssen Sie die unten stehende Funktion sem_getvalue verwenden. Es erhält den aktuellen Wert des Semaphors und wird in das auf Valp gerichtete Ziel platziert.

>>Int sem_getvalue(sem_t*halb, int *Hündchen);

Sem_destroy

Sie sollten die Methode sem_destroy verwenden, wenn Sie den Semaphor zerstören möchten. Wenn der Untergang des Semaphors fortgesetzt werden soll, wartet kein Thread im Semaphor.

>>Int sem_destroy(sem_t*halb);

Installieren Sie das GCC-Dienstprogramm

Um den POSIX Semaphore C-Code zu kompilieren, muss das gcc-Dienstprogramm auf Ihrem Linux-System installiert sein. Öffnen Sie dazu Ihr Befehlsterminal und versuchen Sie den folgenden Befehl.

$sudo apt-get installieren gcc

Bestätigen Sie Ihre Aktion, indem Sie auf drücken UND .

Implementierung von POSIX Semaphore mit C-Programmierung in Ubuntu

Ganz zu Beginn müssen Sie auf dem Ubuntu 20.04-System eine neue Datei mit der Erweiterung .cpp erstellen. Dazu müssen Sie zu Ihrem Home-Verzeichnis navigieren und eine neue leere Datei namens new.cpp erstellen. Sie können es auch mit dem Touch-Befehl in Ihrem Befehlsterminal erstellen.

Sie können sehen, dass die Datei new.cpp im Basisverzeichnis erstellt wurde.


Öffnen Sie nach der Erstellung der .cpp-Datei diese als Texteditor in Ihrem Linux-System und schreiben Sie den folgenden Code unverändert in diese Datei. Danach speichern und schließen Sie es.

Führen Sie das POSIX Semaphore C-Programm in Ubuntu 20.04 aus

Öffnen Sie Ihr Terminal in Ubuntu 20.04 und führen Sie den folgenden gcc-Befehl gefolgt vom Dateinamen aus.

$gccDateiname.c –lpthread –lrt

Es werden 2 Fäden gebildet, einer wird nach 2 Sekunden gebildet. Nach Erhalt der Schraube schläft der allererste Thread für 4 Sekunden. Nach dem Aufruf würde der zweite Thread also nicht direkt beitreten, und dies wird 4-2 = 2 Sekunden nach dem Aufruf angezeigt. Hier ist die Ausgabe:

Wenn wir kein Semaphor verwendet hätten, wäre das Ergebnis gemäß der Kontextumschaltung möglicherweise wie folgt ausgefallen:

Abschluss

In diesem Handbuch wurde ein detaillierter Überblick über die Verwendung von POSIXSemaphore mit der C-Programmierung in Ubuntu 20 gegeben. Durch die bloße Verwendung der POSIX- oder Pthread-Bibliothek im gesamten C-Code kann der POSIX-Semaphor ganz einfach verwendet werden, um Race-Conditions während des Codierens zu verhindern.