Was ist der Zweck ftok in Warteschlangen
Habe ich zu Lesen begonnen message queues eine der IPC-Mechanismus unter Linux .Aber auf den ersten Schritt habe ich einige sehr grundlegende Fragen stellen.
-
Verwendung von
ftok()
zu generieren eindeutige ID (Schlüssel) und was ist das einzigartige ID, die erzeugt werden soll. -
Können wir nicht einfach eine Zahl, um uns die Schlüssel statt mit
ftok()
? -
Was ist der Zweck des Arguments
key
immsget
Funktion?#include "sys/msg.h" key = ftok("/home/beej/somefile", 'b'); msqid = msgget(key, 0666 | IPC_CREAT);
-
Was ist der Unterschied zwischen
msqid
undkey
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
ftok
Funktion erstellt eine Art von identifier zur Verwendung mit den System-V-IPC-Funktionen (semget
,shmget
,msgget
). Es ist wie bei einem filedescriptors: wenn Sie eine Datei öffnen, übergeben Sie einen Pfad zuopen
und erhalten eine Zahl zurück, die dann fürread
undwrite
um die Datei zu identifizieren. Dieftok
Funktion dient einem ähnlichen Zweck, aber während die filedescriptors Anwendungsbereich ist begrenzt auf nur der Prozess, genanntopen
(und Ihre Kinder), dieftok
token gültig ist über das system.Den Grund für das system scope ist, dass Sie wollen zwei oder mehrere unabhängige Prozesse haben Zugriff auf die gleichen IPC-Ressourcen. Also, wenn Sie zwei Programme, die beide ausführen
key = ftok("/home/beej/somefile", 'b');
, beide bekommen die gleiche token und kann deshalb den Zugriff auf die gleichen Ressourcen (Semaphoren, shared memory, message queues). Das ist der springende Punkt, der Inter-Prozess-Kommunikation.Können Sie nicht nur eine "einfache Zahl", wie Sie nicht wissen, ob das token sein könnte, zum Beispiel einen index, um eine system-interne Tabelle oder so etwas. In anderen Worten, Sie wissen nicht, wie Sie dieses token wird intern verwendet, so dass Sie brauchen, um zu verwenden
ftok
.Die man-page sagt: "Der angegebene Pfad muss eine vorhandene Datei angeben, die zugänglich ist, an den aufrufenden Prozess oder der Aufruf schlägt fehl. Beachten Sie auch, dass die links zu den Dateien wird wieder die gleiche Taste, die gleiche id." Von diesem ich gehe davon aus, dass zumindest einige
ftok
Implementierungen erstellen der token durch einen Blick in die inode-Nummer der Datei angegeben Pfad und verbinden Sie es mit dem zweiten argument, um das token zu erstellen. Das zweite argument besteht einfach, so können Sie eine Reihe von IPC-Ressourcen (wie mehrere Semaphoren zu schützen verschiedene Ressourcen).Als für den Unterschied von
key_t
(der Wert, der zurückgegeben wird, durchftok
) und der Wert retured vonmsgget
: die ehemaligen erhalten Sie Zugriff auf eine Reihe von IPC-Ressourcen (semaphore, shared memory und message Queues), während die später identifiziert eine bestimmte message queue.key
ist das erzählen Sie, welches Zimmer zu gehen. Dann mitmsgget
können Sie die box mit Papiere (message queue) in diesem Raum. Diemsgid
ist, dann zeigt einfach nur, dass die box ohne die Notwendigkeit für den Schlüssel erneut.Verstehe ich nicht deine Frage, aber es erzeugt eine eindeutige Kennung an das system (nicht der Prozess) auf der Grundlage der Datei-Pfad angegeben. Diese eindeutige Kennung (gebunden Pfad) ermöglicht es, verschiedene Prozesse zu binden, um die gleiche message queue.
Ja, Sie könnten, wenn Sie entworfen, das es so ist. Aber ein Pfad ist ein universeller Weg, der Ankunft bei einem gemeinsamen deterministische Generierung des Schlüssels Mechanismus, dass mehrere Prozesse können leicht auf.
Siehe 1 & 2
msqid ist Analog zu einem Datei-handle, das senden und empfangen von Nachrichten zu verarbeiten. Der Schlüssel ist, was können Sie assoziieren Sie Ihre Haken in die message-queue Ihr interessiert. Als Analogie, wenn der Schlüssel ist, um einen Datei-Pfad im globalen Dateisystem, dann die msqid würde Ihre Prozess-handle zu Lesen/schreiben.
Was?
Funktionieren könnte, aber was würden Sie wählen-und wer garantiert, dass andere Programme (oder das system selbst) nicht die gleichen zahlen? Das würde zu Verwirrung führen.
Ziel ist die Schaffung eines systemweiten eindeutigen Wert zur Identifizierung eines message-queue. Als Sie in der manpage Staaten,
So, es dauert einfach eine Datei und berechnet eine ID, von der bekannt ist, dass ein anderes Programm mit den gleichen Datei-und Projekt-ID wird das gleiche Ergebnis erhalten.
key
ist nur eine Identifikationsnummer, die einzigartig ist, kann aber für andere Zwecke verwendet, währendmsqid
ist die ID (eine Art Griff) für einen wirklich vorhandenen Warteschlange.