Ich habe angefangen, Nachrichtenwarteschlangen zu lesen, einen der IPC-Mechanismus unter Linux. Aber gleich zu Beginn habe ich einige sehr grundlegende Fragen.
-
Gebrauch von ftok()
eindeutige ID (Schlüssel) zu generieren und welche eindeutige ID zu generieren ist.
-
Können wir nicht einfach eine Nummer verwenden, um unsere Schlüssel zu bekommen, anstatt sie zu benutzen? ftok()
?
-
Was ist der Zweck der Argumentation key
in dem msget
Funktion?
#include "sys/msg.h"
key = ftok("/home/beej/somefile", 'b');
msqid = msgget(key, 0666 | IPC_CREAT);
-
Was ist der Unterschied zwischen msqid
und key
?
Das ftok
Die Funktion erstellt eine Art Kennung, die mit den System V IPC-Funktionen verwendet wird (semget
, shmget
, msgget
). Stellen Sie es sich wie einen Dateideskriptor vor: Wenn Sie eine Datei öffnen, übergeben Sie einen Pfad zu open
und bekomme eine Nummer zurück, die dann verwendet wird read
und write
um die Datei zu identifizieren. Das ftok
Die Funktion dient einem ähnlichen Zweck, aber während der Gültigkeitsbereich des Dateideskriptors auf den aufgerufenen Prozess beschränkt ist open
(und seine Kinder), die ftok
Token ist systemweit gültig.
Der Grund für den Systembereich liegt darin, dass zwei oder mehr unabhängige Prozesse Zugriff auf dieselben IPC-Ressourcen haben sollen. Wenn Sie also zwei Programme haben, die beide ausgeführt werden key = ftok("/home/beej/somefile", 'b');
, erhalten beide den gleichen Token und können daher auf die gleichen Ressourcen (Semaphore, Shared Memory, Message Queues) zugreifen. Das ist der springende Punkt bei der Kommunikation zwischen Prozessen.
Sie können nicht einfach eine “einfache Zahl” verwenden, da Sie nicht wissen, ob das Token beispielsweise ein Index auf eine systeminterne Tabelle oder so etwas sein könnte. Mit anderen Worten, Sie wissen nicht, wie dieses Token intern verwendet wird, also müssen Sie es verwenden ftok
.
Die Manpage sagt: “Der angegebene Pfad muss eine vorhandene Datei angeben, auf die der aufrufende Prozess zugreifen kann, oder der Aufruf schlägt fehl. Beachten Sie außerdem, dass Links zu Dateien denselben Schlüssel mit derselben ID zurückgeben.” Davon gehe ich zumindest teilweise aus ftok
Implementierungen erstellen das Token, indem sie die Inode-Nummer der Datei nachschlagen, die durch angegeben wird Weg und kombinieren Sie es mit dem zweiten Argument, um das Token zu erstellen. Das zweite Argument existiert einfach, damit Sie eine Reihe von IPC-Ressourcen erstellen können (wie mehrere Semaphoren zum Schutz verschiedener Ressourcen).
Was den Unterschied angeht key_t
(der Wert, der von zurückgegeben wird ftok
) und der von zurückgegebene Wert msgget
: Ersteres gibt Ihnen Zugriff auf eine Reihe von IPC-Ressourcen (Semaphor, gemeinsam genutzter Speicher und Nachrichtenwarteschlange), während Letzteres eine bestimmte Nachrichtenwarteschlange identifiziert.