Linux 上の zstd: 2 つの観察
1)大きなファイルを圧縮するためにgzipを起動し、^ Cを使用してgzipを強制終了すると、gzipは終了する前に出力ファイルを削除します。 zstdは現在それをしていません。 不完全または破損した出力ファイルを使用するよりも、出力ファイルを使用しない方がよいため、gzipの動作は優れていると思います。
2)ファイルを圧縮または解凍する場合、zstdは以下のシステムコールを使用して(straceから)出力ファイルを作成します。
open("file.zst", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
gzipとxzは同様のシステムコールを使用しますが、モード0600を使用します。ファイルが閉じられた後、出力ファイルのモードを目的のモードに切り替えます。 zstdが0666を使用する理由はありますか? 0600の方が良いと思います。ファイルの準備ができるまで、他のユーザーに読み取りアクセスを許可しないでください。
^C
イベントをトラップするには、シグナルハンドラーが必要です。 まだ調べていません。 移植性の問題も心配です。
あなたのトレースは私たちのコードよりも正確です。
宛先ファイルを開くための呼び出しは次のとおりです。
https://github.com/facebook/zstd/blob/dev/programs/fileio.c#L324
これは単なる標準のfopen("name", "wb");
、プロパティビットは制御しません。
それはたまたまあなたのシステムでこのトレースに変換されます、ただ私たちがそれを制御できないことを知っています。
一般に、移植性の理由(および依存関係の問題の軽減)のために、標準Cに可能な限り近づけるようにしています。
まず第一に:zstdを書いてくれてありがとう。 スピードと圧縮率に驚いています! 非常に素晴らしい!
お気軽にこのチケットを閉じてください。 私の2つの観察結果はほんの小さな問題であり、何もしないことにした場合はまったく問題ありません。
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 );
fopen()の代わりにopen()を使用するため、出力ファイルのパーミッションビットを制御できます。
そうです、 xz
はPOSIX
準拠のシステムをターゲットにしていると思います。
したがって、非posixシステムとの互換性がないか、カスタムラッパーが必要になるという犠牲を払って、 posixライブラリを自由に使用できます(Windowsが思い浮かびます)。
zstd
は、移植性の観点を改善するために、可能な限り標準Cになるように努めています。
技術的には、標準Cに相当するものがない場合、OSに依存するインターフェイスを使用することもあります。 そのような場合、複数のターゲットをサポートするためにいくつかのバリアントを作成しようとします。サポートされていないものについては、関連する機能がきれいに無効にされます (これらは必須ではない傾向があります)。
それについてもう少し学んだ後、関数signal()
は実際には標準Cの一部であるように見えます。これにより、かなり移植性が高くなります。
最新のdev
ブランチの更新では、 Ctrl-C
トラップをzstd
cliに追加しました。
Ctrl-C
押すと、終了する前に操作アーティファクト (未完了の宛先ファイル) が消去されるようになりました。