2016-07-10 8 views
0

Die meisten Dateisysteme verwenden Sperren zum gleichzeitigen Lesen/Schreiben. Was aber, wenn nach einem Leseaufruf ein Schreibaufruf ausgeführt wird, der die Daten löscht, die dem vorherigen Leseaufruf vorausgingen.Löschen von Daten mit gleichzeitigem Lesen/Schreiben im Dateisystem

Wird der Zeiger für eine Datei zum Lesen geöffnet, um den neuen Start der nun kleineren Datei anzuzeigen?

Antwort

1

Die Frage ist nicht wirklich gültig, weil Sie Daten nicht löschen können, die den Systemaufruf verwenden. Sie können überschreiben Daten mit dem Systemaufruf write (2), aber Sie können nicht löschen Daten. Jetzt können Sie die Datei mit dem Systemaufruf truncate (2) abschneiden. Dies ändert die Größe der Datei (die über das st_size-Feld durch den Systemaufruf stat (2) gemeldet wird) und alle Bytes nach dem Ende der Datei, die von der geänderten st_size gemeldet werden, sind null. Sie können die Größe der Datei mithilfe des Systemabrufs truncate erhöhen, indem Sie eine neue Größe anfordern, die größer als die aktuelle Größe ist. Es ist undefiniert (gemäß der POSIX-Spezifikation), ob dies zulässig ist oder was das System tun wird, wenn es eine Abschneidung erhält, die größer als die aktuelle Größe der Datei ist. Bei vielen Dateisystemen wird die Größe der Datei einfach auf die angeforderte Größe eingestellt.

OK, ein paar mehr Konzepte. Zu jeder geöffneten Dateistruktur gehört ein Dateioffsetzeiger. Versuche, eine Datei unter Verwendung des Systemaufrufs read (2) oder write (2) zu lesen oder zu schreiben, werden den Offset-Zeiger um die Anzahl der gelesenen oder geschriebenen Bytes vorrücken. Wenn Sie eine Datei zweimal mit dem Systemaufruf open (2) öffnen, erhalten Sie zwei Dateideskriptoren, die sich jeweils auf eine andere offene Dateistruktur beziehen, und in diesem Fall eine Lese- (2) oder eine Schreiboperation (2) unter Verwendung einer Datei Der Deskriptor ändert den Dateioffset für den anderen Dateideskriptor nicht. (Wenn Sie einen Dateideskriptor mit dem Systemaufruf dup (2) klonen, erhalten Sie einen zweiten Dateideskriptor, der auf die gleiche Dateistruktur verweist, und dann werden Änderungen an der Dateistruktur über einen Dateideskriptor vorgenommen, 2), write (2) oder lseek (2) Systemaufrufe werden über den geklonten Dateideskriptor wiedergegeben. Aber das ist ein Nebenproblem, also werde ich zu diesem Thema vorerst nichts sagen.)

Jetzt, wenn Wenn Sie die Datei abschneiden, wird der Dateioffset im Dateideskriptor nicht geändert. Alle Bytes nach der abgeschnittenen Größe sind jedoch null, wenn sie gelesen werden. Die Antwort lautet also, dass der Dateioffsetzeiger nach dem Abschneiden nicht aktualisiert wird. Ein Versuch, über die abgeschnittene Datei hinaus zu lesen, gibt jedoch nur Nullen zurück.

+0

Danke für den Vorschlag. Um also den Offset eines Dateideskriptors zu aktualisieren, kann ich ihn einfach dup2 und dann den Dateioffset des duped fd dorthin lenken, wo ich es haben will. Gibt es eine Möglichkeit, auf die Dateideskriptortabelle in Unix zuzugreifen? – pqx994

+0

Abschneiden funktioniert nicht - Ich möchte Daten löschen, die dem Dateioffset eines vorherigen Leseaufrufs vorausgehen. – pqx994

+0

Ich habe gerade die Tatsache verbunden, dass Sie auch die Person sind, die die Frage nach "Löschen von bereits gelesenen Daten aus Datei auf Systemebene" gestellt hat. Nichts für ungut, aber Sie bellen wirklich den falschen Baum auf diesem .... –

Verwandte Themen