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:
- meine eigenen System Anrufe zu definieren (zur Zeit nicht bevorzugt)
- 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.
Haben Sie MMAP-Dateien oder Named Pipes berücksichtigt? Sie sind viel einfacher als SysV ipc. –
ja, tatsächlich Zuordnung von Shared-Memory-Objekt verwendet wird – ivcha