Wenn wir verwenden, echo 1234 >> some-file
besagt die Dokumentation, dass die Ausgabe angehängt wird.
Ich vermute, wenn eine Datei nicht existiert, erstellt O_CREAT eine neue Datei. Wenn >
verwendet, schneidet O_TRUNC die vorhandene Datei ab.
Im Fall von >>
: Wird die Datei als O_WRONLY (oder O_RDWR) geöffnet und versucht, den Vorgang zu beenden, und der Schreibvorgang wird ausgeführt, wobei O_APPEND simuliert wird? Oder wird die Datei als O_APPEND geöffnet und dem Kernel überlassen, um sicherzustellen, dass das Anhängen erfolgt?
Ich frage dies, weil ein Conserver-Prozess einige durch Echo eingefügte Markierungen überschreibt, wenn die Ausgabedatei vom NFS-Einhängepunkt stammt. Die NFS-Dokumentation besagt, dass O_APPEND auf dem Server nicht unterstützt wird, sodass der Client-Kernel damit umgehen muss. Ich schätze, der Conserver-Prozess verwendet O_APPEND, ist sich jedoch nicht sicher, ob er >>
unter Linux läuft, und stellt daher hier die Frage.
O_APPEND
es nicht unterstützt wird. Das Problem ist, dass es emuliert ist. In einem lokalen DateisystemO_APPEND
überschreiben mehrere Prozesse, die in dieselbe Datei schreiben, die mit geöffnet wurde , niemals die Daten des anderen. Auf NFSO_APPEND
wird emuliert, indem bis zum Ende vor dem Schreiben gesucht wird, was die Möglichkeit von Rennbedingungen lässt. Daran führt bei NFS kein Weg vorbei. Jeder Parallelschreiber muss eine eigene Datei schreiben. Die einzige Möglichkeit, dies zu umgehen, besteht darin, einen Serverprozess auf dem NFS-Server einzurichten, die Protokollierer zu protokollieren|nc server port
und eingehende Daten an das Protokoll anzuhängen.