Gibt es einen Linux-Systemaufruf, um eine "Ansicht" eines Dateibereichs zu erstellen?

7

Stellt Linux einen Systemaufruf bereit, mit dem eine "Ansicht" eines begrenzten Bytebereichs einer Sicherungsdatei erstellt werden kann? Ich stelle mir etwas vor, das beispielsweise auf einen geöffneten Dateideskriptor einwirkt und diesen entweder ändert oder einen neuen Dateideskriptor generiert, bei dem sich die Dateiversätze relativ zum Anfang des Bereichs und zum Ende des Bereichs befinden.

Der Anwendungsfall wäre, einen nicht kooperierenden Unterprozess darauf zu beschränken, nur auf einen bestimmten Teil einer Eingabedatei zuzugreifen.

llasram
quelle
Siehe auch Erstellen einer virtuellen Datei, die eigentlich ein Befehl ist
Gilles 'SO - hör auf böse zu sein'
@ Gilles Ich habe eine Pipe (mit Namen oder auf andere Weise) vermieden, weil ich die zusätzliche Kopie von Daten über den Benutzerbereich vermeiden wollte und dachte, ich müsste den Unterprozess in seiner eingeschränkten Eingabe willkürlich suchen. Aber jetzt, wo Sie es erwähnt haben, splice()scheint eine Pipe plus der Systemaufruf fast richtig für den Stream-Fall zu sein.
Lasram
Während die akzeptierte Antwort funktioniert, ist es nicht wirklich ein "Systemaufruf", wie die gestellte Frage. Bei Systemaufrufen fällt der mmap()Aufruf ein, solange der
Unterprozess
Siehe auch obligatorische Dateisperrung, bei der Sie einen Bereich der Datei sperren können, damit der Prozess sie nicht lesen oder schreiben kann.
Stéphane Chazelas

Antworten:

12

Eine Möglichkeit, dies zu tun, besteht darin, ein Schleifengerät zu verwenden. Dieser Ansatz hat zwei Anforderungen, die ihn möglicherweise weniger nützlich machen: Sie müssen root sein, um ihn einzurichten, und der nicht kooperierende Unterprozess muss in der Lage sein, auf ein Blockgerät zu schreiben. Oh, und es geht nicht um widersprüchliche Veränderungen.

Führen Sie aus, um das Loop-Gerät einzurichten

losetup -o 1024 --sizelimit 2048 --show -f yourfile

ersetzt 1024, 2048und yourfilemit entsprechenden Werten - -oGibt die Startoffset, --sizelimitdie Größe (zählend vom Offset). Beachten Sie, dass sizelimitdies ein Vielfaches von 512 sein muss.

Dadurch wird der Name des eingerichteten Schleifengeräts ausgegeben. Passen Sie die Berechtigungen nach Bedarf an und geben Sie sie an Ihren nicht kooperierenden Unterprozess weiter. Wenn Sie das Gerät nicht mehr benötigen, löschen Sie es mit

losetup -d /dev/loopN

Ngegebenenfalls ersetzen .

Stephen Kitt
quelle
Hmm, was meinst du mit widersprüchlichen Veränderungen? Meinen Sie damit, dass Schreibvorgänge, die über das Loop-Gerät eingehen, nicht mit direkten Schreibvorgängen in die Sicherungsdatei synchronisiert sind?
Ilkkachu
Nicht 100% was ich wollte, aber wenn nichts näher dran ist, nehme ich es. Vielen Dank!
Lasram
@ilkkachu ja, ich meine, dass es eine gewisse "Übereinstimmung" zwischen den Prozessen darüber geben muss, wer schreiben darf. (Es kann einfach genug sein - wenn der "übergeordnete" Prozess nicht schreibt, während das Schleifengerät für den nicht kooperierenden Unterprozess eingerichtet ist, ist alles in Ordnung.)
Stephen Kitt
@llasram richtig, ich weiß, das ist nicht perfekt; Interessant ist auch der FIFO-Ansatz in Gilles 'Link.
Stephen Kitt