4 Stimmen

Zugangskontrolle zum gemeinsamen Speicher

Ich schätze, diese Frage richtet sich an Linux/Unix-Systemprogrammierungsexperten (leider gehöre ich noch nicht zu dieser Sorte ;)).

Ich baue ein System auf, das auf einem Linux/Unix-Multicore-Rechner läuft, in dem Prozesse über gemeinsamen Speicher miteinander kommunizieren (Geschwindigkeit ist wichtig - möglichst wenige Aufrufe in den Kernel). Shared-Memory-"Kanäle" für die Kommunikation werden dynamisch erstellt, wenn ein Prozess die Kommunikation mit einem anderen anfordert - jeder Prozess hat einen Listening-Thread, der diese Anforderungen empfängt und "annimmt" und dann Shared-Memory-Kanäle erstellt/initialisiert. Für Prozesse a y b werden zwei Kanäle (gemeinsame Speicherbereiche) erstellt - ein Kanal wird als "Ausgang" von a und "Eingabe" an b und das andere umgekehrt.

Bei der Erstellung der Kommunikationskanäle ist es zwingend erforderlich, daß Prozeß a auf seinen entsprechenden "Ausgangs"-Kanal R/W-Zugriff und auf seinen entsprechenden "Eingangs"-Kanal nur R-Zugriff hat. Andere Prozesse dürfen keinen W-Zugriff auf die von anderen Prozesspaaren gemeinsam genutzten Kanäle erhalten können (vorzugsweise sollten sie nicht einmal R-Zugriff haben).

Welche Lösung können Sie vorschlagen?

Ich habe darüber nachgedacht:

  1. meine eigenen Systemaufrufe zu definieren (im Moment nicht wünschenswert)
  2. Verwendung von Dateiberechtigungen, die dem Dateisystem eigen sind, um diese Zugriffsrechte zu erteilen

Bei der zweiten Lösung besteht die Idee darin, Prozesse unter verschiedenen Benutzerkennungen laufen zu lassen und für jedes Prozesspaar dynamisch Gruppen zu erstellen und jedem gemeinsam genutzten Speicherdeskriptor eine entsprechende Dateiberechtigung zuzuweisen (R für die Gruppe, R/W für den schreibenden Prozess, - für den Rest).

Ist die 2. Lösung machbar? Gibt es bessere Lösungen (z.B. mit Systemaufrufen, die mir nicht bekannt sind)?

Vielen Dank für Ihre Zeit und Ihre Hilfe.

4voto

caf Punkte 224189

Sie können dazu keine Gruppen verwenden, da es nicht möglich ist, einem bereits laufenden Prozess zusätzliche Gruppen hinzuzufügen. Der benutzerbasierte Mechanismus funktioniert jedoch problemlos.

Führen Sie jeden Prozess unter seiner eigenen uid aus. Um einen gemeinsamen Speicherkanal zu erstellen, erstellt die sendende Seite ein gemeinsames Speicherobjekt mit shm_open() unter Angabe von O_RDWR | O_CREAT | O_EXCL und Modus 0600 . Er ist also der einzige Prozess, der ihn geöffnet hat, und nur seine UID darf ihn öffnen. Die sendende Seite öffnet dann einen zweiten Dateideskriptor für dasselbe gemeinsame Speichersegment, diesmal mit O_RDONLY . Er sendet diesen zweiten, schreibgeschützten Dateideskriptor an den empfangenden Prozess, indem er eine SCM_RIGHTS Nachricht über einen Unix-Domain-Socket. Es kann dann den schreibgeschützten Dateideskriptor schließen.

Der Sendevorgang und der Empfangsvorgang mmap() den gemeinsamen Speicher. Der empfangende Prozess hat nur Lesezugriff und ist nicht berechtigt, ihn auf Lese- und Schreibzugriff umzustellen. Kein anderer Prozess kann ihn überhaupt öffnen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X