Erstellen von eindeutigen Schlüssel für eine Nachrichten-Warteschlange für eine App, die mehrere Instanzen haben kann
-
19-08-2019 - |
Frage
Ich habe eine Linux CUI app gemacht, die zwischen Prozessen über die Nachrichten-quene in Verbindung steht.
Es gibt kein Problem mit ihm, solange es sich um eine einzelne Instanz ist. Allerdings, wenn es mehrere Instanzen des gleichen App sind, die Nachrichten in der quene an die falschen Instanz gesendete.
Ich verstehe dies, indem sie die msgget Funktion einen eindeutigen Schlüssel vermieden werden können. Mit ftok () einen Schlüssel zu erstellen, aber da die Variablen gleich sind sie führen identische Schlüssel.
Kann jemand mich leiten, wie für jede Instanz einen eindeutigen Schlüssel haben?
Die einzige Idee, die ich jetzt habe, ist die Variable randamize, ftok gegeben und Ich weiß, dass kann nicht richtig sein.
Lösung
Seien Sie vorsichtig mit ftok!
Dies wird nur für ein bestimmtes Dateisystem eindeutig sein und nur dann, wenn dann, wenn das Dateisystem nicht stark genutzt. fttok wird durch die Datei-Eintragsnummer im Dateisystem angetrieben wird.
Dies war früher ein ziemlich guter Weg, um eindeutige Werte sein, aber die Zeit und fing Moores Gesetz vor ein paar Jahren mit ihm auf. Es funktioniert auf die untere 8 Bits der Dateinummer, aber die tatsächlichen Dateinummer ist jetzt 32 Bit und Nummerierung beginnt wieder für jedes Dateisystem.
Prozess-ID ist eine ziemlich gute Wahl, sie tun vollen recycliertem bekommen, aber nicht so solange der Prozess noch am Leben ist.
Andere Tipps
Sie könnten versuchen, den Prozess-ID verwenden. Mein google foo bekam diese
Suche global eindeutige IDs in der Regel Guid oder Uuid genannt. Es muss eine Bibliothek, die Sie ihnen zu erzeugen, verwenden können. Sie sind einzigartig Saiten von Ihrer nic-Adresse, die aktuelle Zeit und eine Zufallszahl.
Wie wäre es um die Uhr? WikiPedia sagt es sich als RDTSC besser ist (und SMP sicher).
„Unter Linux, eine ähnliche Funktionalität durch das Lesen der Wert von CLOCK_MONOTONIC
Uhr vorgesehen ist POSIX clock_gettime Funktion.“