2009-03-17 10 views
2

Ich habe eine Linux-CUI-Anwendung erstellt, die über Message-Quene zwischen Prozessen kommuniziert.Erstellen von eindeutigen Schlüsseln für eine Nachrichtenqueue für eine App, die mehrere Instanzen haben kann

Es gibt kein Problem damit, solange es eine einzelne Instanz ist. Wenn jedoch mehrere Instanzen derselben App vorhanden sind, werden die Nachrichten in der Queue an die falsche Instanz gesendet.

Ich verstehe, dass dies vermieden werden kann, indem Sie der msgget-Funktion einen eindeutigen Schlüssel geben. Verwenden von ftok(), um einen Schlüssel zu erstellen, aber da die Variablen identisch sind, ergeben sie identische Schlüssel.

Kann mir jemand helfen, einen eindeutigen Schlüssel für jede Instanz zu haben?

Die einzige Idee, die ich jetzt habe, ist die Variable zu ftok randamize, und Ich weiß, dass kann nicht richtig sein.

Antwort

2

Seien Sie vorsichtig mit ftok!

Dies ist nur für ein bestimmtes Dateisystem und nur dann eindeutig, wenn dann das Dateisystem nicht stark beansprucht wird. fttok wird von der Dateieintragsnummer im Dateisystem gesteuert.

Dies war eine ziemlich gute Möglichkeit, einzigartige Werte zu bekommen, aber die Zeit und Moores Gesetz hat es vor ein paar Jahren eingeholt. Es funktioniert auf die unteren 8 Bits der Dateinummer, aber die tatsächliche Dateinummer ist jetzt 32 Bits und Nummerierung beginnt erneut für jedes Dateisystem.

Prozess-ID ist eine ziemlich gute Wahl, sie werden recycelt, aber nicht so lange, wie der Prozess noch am Leben ist.

+0

danke für den Rat! Ich denke immer daran, wenn ich ftok benutze – Saifis

2

Sie könnten versuchen, die Prozess-ID zu verwenden. Mein Google Foo hat this

0

Suchen global eindeutige IDs normalerweise Guid oder Uuid genannt. Es muss eine Bibliothek geben, mit der Sie sie erstellen können. Sie sind eindeutige Zeichenfolgen, die aus Ihrer NIC-Adresse, der aktuellen Uhrzeit und einer Zufallszahl bestehen.

0

Wie wäre es mit der Uhr? WikiPedia sagen, es ist besser als RDTSC (und SMP sicher).

"Unter Linux wird ähnliche Funktionalität durch Lesen des Werts CLOCK_MONOTONIC Uhr mit POSIX clock_gettime Funktion bereitgestellt."