zstd unter Linux: zwei Beobachtungen
1) Wenn ich gzip starte, um eine große Datei zu komprimieren, und wenn ich gzip mit ^ C beende, löscht gzip die Ausgabedatei vor dem Beenden. zstd tut das derzeit nicht. Ich denke, das Verhalten von gzip ist besser, weil es besser ist, keine Ausgabedatei zu haben, als eine unvollständige oder beschädigte Ausgabedatei.
2) Beim Komprimieren oder Dekomprimieren einer Datei verwendet zstd den folgenden Systemaufruf, um die Ausgabedatei (von strace) zu erstellen:
open("file.zst", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
gzip und xz verwenden ähnliche Systemaufrufe, verwenden jedoch den Modus 0600. Sie schalten den Modus der Ausgabedatei auf den gewünschten Modus um, nachdem die Datei geschlossen wurde. Gibt es einen Grund, warum zstd 0666 verwendet? Ich denke, 0600 wäre besser: Erlaube anderen Benutzern keinen Lesezugriff, bevor die Datei fertig ist.
Das Abfangen des ^C
Ereignisses erfordert einen Signalhandler. Ich habe mich noch nicht darum gekümmert. Ich mache mir auch Sorgen um die Portabilität.
Ihre Spur ist genauer als unser Code.
Der Aufruf zum Öffnen der Zieldatei ist hier:
https://github.com/facebook/zstd/blob/dev/programs/fileio.c#L324
Es ist nur ein Standard fopen("name", "wb");
, wir kontrollieren kein Eigenschaftsbit.
Es wird zufällig in diesem Trace auf Ihrem System übersetzt, wissen Sie nur, dass wir keine Kontrolle darüber haben.
Im Allgemeinen versuchen wir aus Gründen der Portabilität (und der Reduzierung von Abhängigkeitskopfschmerzen) so nah wie möglich am Standard C zu bleiben.
Zunächst einmal: danke, dass du zstd geschrieben hast. Ich bin begeistert von Geschwindigkeit und Kompressionsverhältnis! Sehr schön!
Bitte zögern Sie nicht, dieses Ticket zu schließen. Meine beiden Beobachtungen sind nur kleine Trottel und es ist vollkommen in Ordnung, wenn Sie sich entscheiden, nichts zu tun.
int flags = O_WRONLY | O_BINARY | O_NOCTTY | O_CREAT | O_EXCL;
#ifndef TUKLIB_DOSLIKE
flags |= O_NONBLOCK;
#endif
const mode_t mode = S_IRUSR | S_IWUSR;
dest_fd = open( dest_name, flags, mode );
Sie verwenden open() anstelle von fopen() - und können somit die Berechtigungsbits der Ausgabedatei steuern.
Richtig, ich glaube, xz
zielt auf POSIX
konforme Systeme ab.
Daher kann es Posix-Bibliotheken frei verwenden, auf Kosten der Nichtkompatibilität mit Nicht-Posix-Systemen oder der Notwendigkeit benutzerdefinierter Wrapper (Windows kommt mir in den Sinn).
zstd
versucht so weit wie möglich Standard-C zu sein, um die Portabilitätsperspektiven zu verbessern.
Technisch verwenden wir gelegentlich auch einige OS-abhängige Schnittstellen, wenn es kein Standard-C-Äquivalent gibt. In diesem Fall versuchen wir, mehrere Varianten zu schreiben, um mehrere Ziele zu unterstützen. Bei nicht unterstützten Zielen werden relevante Funktionen sauber deaktiviert (sie sind in der Regel nicht unbedingt erforderlich).
Nachdem Sie ein bisschen mehr darüber erfahren haben, scheint es, dass die Funktion signal()
tatsächlich Teil von Standard C ist , was es ziemlich gut portabel macht.
Im letzten dev
Filial-Update habe ich Ctrl-C
Trapping zu zstd
cli hinzugefügt.
Beim Drücken von Ctrl-C
löscht es jetzt das Operationsartefakt (unfertige Zieldatei) vor dem Beenden.