2010-12-09 15 views
1

Ich denke, diese Frage richtet sich an Linux/Unix-Systemprogrammierer (leider bin ich noch nicht einer davon;)).Zugriffskontrolle auf shared memory

Ich baue ein System, das auf Linux/Unix läuft, Multi-Core-Maschine, in der Prozesse miteinander über Shared Memory kommunizieren (Geschwindigkeit ist wichtig - minimale Aufrufe in den Kernel wie möglich). Gemeinsam genutzte Speicher- "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 "akzeptiert" und dann gemeinsam genutzte Speicherkanäle erstellt/initialisiert. Für Prozesse a und b, zwei Kanäle (gemeinsame Speicherbereiche) erzeugt - ein Kanal als „Ausgang“ verwendet wird, aus a und „Input“ zu b und der anderen umgekehrt.

Bei der Erstellung der Kommunikationskanäle ist es zwingend erforderlich, dass der Prozess a auf den entsprechenden "Ausgangskanal" R/W-Zugriff und auf den entsprechenden "Eingangskanal" nur R-Zugriff hat. Andere Prozesse müssen nicht in der Lage sein, W-Zugriff auf die Kanäle zu erhalten, die zwischen anderen Paaren von Prozessen geteilt werden (vorzugsweise sollten sie nicht einmal einen R-Zugriff haben).

Welche Lösung können Sie vorschlagen?

Ich dachte an:

  1. meine eigenen System Anrufe zu definieren (zur Zeit nicht bevorzugt)
  2. Dateiberechtigungen inhärent auf das Datei-System mit diesen Zugriffsrechte zu verhängen

Für die zweite Lösung besteht die Idee darin, Prozesse unter verschiedenen Benutzer - IDs auszuführen und die dynamische Erstellung von Gruppen für jedes Prozesspaar zu verwenden und jedem gemeinsam genutzten Speicherdeskriptor eine Dateiberechtigung zuzuweisen (R zu Gruppe, R/W zu dem Schreibprozess, - zu sich ausruhen).

Ist die zweite Lösung durchführbar? Gibt es bessere Lösungen (z. B. einige Systemaufrufe, die ich nicht kenne)?

Vielen Dank für Ihre Zeit und Hilfe.

+0

Haben Sie MMAP-Dateien oder Named Pipes berücksichtigt? Sie sind viel einfacher als SysV ipc. –

+0

ja, tatsächlich Zuordnung von Shared-Memory-Objekt verwendet wird – ivcha

Antwort

1

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

Führen Sie jeden Prozess unter seiner eigenen UID. Um einen gemeinsam genutzten Speicherkanal zu erstellen, erstellt die sendende Seite ein gemeinsames Speicherobjekt mit shm_open() unter Angabe von O_RDWR | O_CREAT | O_EXCL und 0600. Somit ist es der einzige offene Prozess, und nur seine UID darf es öffnen. Die sendende Seite öffnet dann einen zweiten Dateideskriptor für dasselbe gemeinsame Speichersegment, diesmal unter Verwendung von O_RDONLY. Er sendet diesen zweiten, schreibgeschützten Dateideskriptor an den Empfangsprozess unter Verwendung einer SCM_RIGHTS Nachricht über einen Unix-Domain-Socket. Es kann dann den schreibgeschützten Dateideskriptor schließen.

Der sendende Prozess und der empfangende Prozess dann mmap() der geteilte Speicher. Der empfangende Prozess hat nur Lesezugriff und hat nicht die Rechte, ihn auf Lese-/Schreibzugriff zu aktualisieren. Keine anderen Prozesse können es überhaupt öffnen.

+0

dies fügt nur wenige Systemaufrufe pro Paar-Verbindung Initialisierung, die ausgezeichnet ist. Danke für deine Antwort! – ivcha

+0

@ kaptoxic: In der Tat, und ich würde empfehlen, UNIX-Domain-Sockets für die "Anfrage zu kommunizieren" Nachrichtenkanal zu verwenden, so dass Sie die Shared-Memory-Dateideskriptoren darüber senden können. – caf