Was sind die Unterschiede zwischen den Funktionen in <semaphore.h>
und <sys/sem.h>
?
Gibt es eine Situation, in der es besser ist, eine Kopfzeile oder die andere zu verwenden?
<sys/sem.h>
stellt die Schnittstelle für Semaphore von XSI (ursprünglich Unix System V) bereit. Diese sind nicht Teil des POSIX-Basisstandards (sie sind in der XSI-Option, die weitgehend für traditionelle Unix-Kompatibilität ist) und obwohl sie noch nicht als veraltet gelten, betrachten viele Programmierer sie als veraltet, und POSIX rät:
ANWENDUNGSVERWENDUNG
Die POSIX Realtime Extension definiert alternative Schnittstellen für die Interprozesskommunikation. Anwendungsentwickler, die IPC verwenden müssen, sollten ihre Anwendungen so entwerfen, dass Module, die die in XSI Interprocess Communication beschriebenen IPC-Routinen verwenden, leicht modifiziert werden können, um die alternativen Schnittstellen zu verwenden.
Die Vorteile und Nachteile von XSI-Semaphoren liegen darin, dass sie Kernel-Space-Objekte sind und müssen, weil ihre Oberfläche funktioniert. Der Hauptvorteil, den Sie daraus ziehen können, ist die Möglichkeit, sie so einzurichten, dass der Kernel Operationen rückgängig machen kann, wenn der Prozess beendet wird oder unerwartet beendet wird. Die Hauptkosten sind, dass jede Operation eine Hinwendung zum Kernel-Space ist, d. H. Sie sind sehr langsam. Die Schnittstellen für deren Verwendung sind ebenfalls sehr stumpf und schwer zu erlernen, und sie sind notwendigerweise eine gemeinsam genutzte Ressource, was bedeutet, dass Sie sich mit Problemen bei der gemeinsamen Namespace- und Ressourcenbereinigung beschäftigen müssen.
<semaphore.h>
definiert POSIX-Semaphore, die so entworfen sind, dass sie vollständig im Benutzerbereich implementiert werden können, außer in dem strittigen Fall, in dem der Prozess den Kernel zum Einschlafen aufrufen wird. Ihre Leistung sollte nahezu optimal sein (d. H. Fast unmöglich, die eigenen zu schlagen), aber sie sind nicht ganz so aussagekräftig wie XSI-Semaphoren. POSIX-Semaphoren bieten Ihnen auch die Wahl, ob Sie einen prozesslokalen Semaphor (für die Verwendung in einer Multi-Threaded-Umgebung oder sogar unter bestimmten Bedingungen einen Signal-Handler in einem Singlethread-Programm) oder einen Prozess-Shared-Semaphor verwenden möchten. Im letzteren Fall haben Sie auch die Wahl, ob das System die Zuordnung in einem freigegebenen Namespace anhand des Namens behandeln oder selbst Shared Memory erhalten und im Shared Memory initialisieren soll.
Sie sind nicht das Gleiche / ersetzen einander, sondern zwei verschiedene Implementierungen und bieten verschiedene Funktionen. semaphore.h
ist eine Implementierung von posix und sys/sem.h
ist die Implementierung von sysV. POSIX wird als betrachtet, um leichter und weit verbreitet zu sein.