Was ist der Zweck von ftok in Nachrichtenwarteschlangen?

Lesezeit: 5 Minuten

Benutzeravatar von Amit Singh Tomar
Amit Singh Tomar

Ich habe angefangen, Nachrichtenwarteschlangen zu lesen, einen der IPC-Mechanismus unter Linux. Aber gleich zu Beginn habe ich einige sehr grundlegende Fragen.

  1. Gebrauch von ftok() eindeutige ID (Schlüssel) zu generieren und welche eindeutige ID zu generieren ist.

  2. Können wir nicht einfach eine Nummer verwenden, um unsere Schlüssel zu bekommen, anstatt sie zu benutzen? ftok()?

  3. 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);
    
  4. 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.

  • Danke @Drak für deine Erklärung, es ist sehr hilfreich, also kann ich Schlüssel als Name von Nachrichtenwarteschlangen denken?

    – Amit Singh Tomar

    9. September 2011 um 7:53 Uhr


  • Ich versuche es mal etwas abstrakter, vielleicht hilft das: Stellen Sie sich vor, es gibt mehrere Räume. In jedem Raum gibt es eine Kiste, die mit Semaphoren gefüllt werden kann, eine Tafel (gemeinsames Gedächtnis) und eine Kiste, die mit Papieren (Nachrichten) gefüllt werden kann. Jetzt, key sagt dir, in welches Zimmer du gehen sollst. Dann mit msgget Sie können die Kiste mit Papieren (Nachrichtenwarteschlange) in diesem Raum erhalten. Das msgid zeigt dann genau auf diese Box, ohne dass der Schlüssel erneut benötigt wird.

    – Dunkler Staub

    9. September 2011 um 8:14 Uhr

  • Sie wissen nicht, wie dieses Token intern verwendet wird, also müssen Sie es verwenden ftok. ftok() bietet absolut keine Garantien, dass die zurückgegebenen key_t ist einzigartig. Wenn die Anzahl der möglichen Dateien in einem Dateisystem und die verwendeten 8 Bit aus id ist größer als der Bereich von key_t, kann das Ergebnis auch für verschiedene Dateien im selben Dateisystem nicht eindeutig sein. Und Systeme haben ziemlich oft mehrere Dateisysteme gemountet, also die Möglichkeit für key_t Kollision ist noch größer. Linux verwendet ein 32-Bit key_twas bedeutet, sobald es mehr als 16 Millionen Dateien gibt, key_t Werte müssen dupliziert werden.

    – Andreas Henle

    23. März 2020 um 15:20 Uhr

  1. Ich verstehe Ihre Frage nicht ganz, aber sie generiert eine eindeutige Kennung für das System (nicht für den Prozess), basierend auf dem angegebenen Dateipfad. Diese eindeutige Kennung (an den Pfad gebunden) ermöglicht verschiedenen Prozessen, sich an dieselbe Nachrichtenwarteschlange zu binden.

  2. Ja, das könntest du, wenn sie es so gestaltet hätten. Ein Dateipfad ist jedoch ein universellerer Weg, um zu einem gemeinsamen deterministischen Schlüsselerzeugungsmechanismus zu gelangen, auf den mehrere Prozesse leicht zugreifen können.

  3. Siehe 1 & 2

  4. msqid ist analog zu einem Datei-Handle, mit dem Sie Nachrichten an dieses Handle senden und empfangen können. Der Schlüssel ermöglicht es Ihnen, Ihren Hook mit der Nachrichtenwarteschlange zu verknüpfen, an der Sie interessiert sind. Als Analogie, wenn der Schlüssel zu einem Dateipfad im globalen Dateisystem gehört, dann wäre die msqid das Handle Ihres Prozesses zum Lesen/Schreiben .

  1. Was?

  2. Das könnte funktionieren, aber welches würden Sie wählen und wer garantiert, dass andere Programme (oder das System selbst) nicht dieselben Nummern verwenden? Das würde zu Verwirrung führen.

  3. Der Zweck besteht darin, einen systemweit eindeutigen Wert bereitzustellen, um eine Nachrichtenwarteschlange zu identifizieren. Wie die Manpage sagt,

    Typischerweise kombiniert ein Best-Effort-Versuch das gegebene proj_id-Byte, die unteren 16 Bits der Inode-Nummer und die unteren 8 Bits der Gerätenummer zu einem 32-Bit-Ergebnis. Kollisionen können leicht passieren, zum Beispiel zwischen Dateien auf /dev/hda1 und Dateien auf /dev/sda1.

    Es nimmt also einfach eine Datei und berechnet eine ID, von der bekannt ist, dass ein anderes Programm, das dieselbe Datei und dieselbe Projekt-ID verwendet, dasselbe Ergebnis erhält.

  4. key ist nur eine eindeutige Kennung, die jedoch für andere Zwecke verwendet werden kann msqid ist die ID (eine Art Handle) für eine wirklich existierende Warteschlange.

1437460cookie-checkWas ist der Zweck von ftok in Nachrichtenwarteschlangen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy