zstd di Linux: dua pengamatan
1) Jika saya memulai gzip untuk mengompres file besar dan jika saya mematikan gzip menggunakan ^ C, gzip akan menghapus file keluaran sebelum menghentikannya. zstd saat ini tidak melakukan itu. Saya pikir perilaku gzip lebih baik, karena lebih baik tidak memiliki file keluaran daripada memiliki file keluaran yang tidak lengkap atau rusak.
2) Saat mengompresi atau mendekompresi file, zstd menggunakan panggilan sistem di bawah ini untuk membuat file output (dari strace):
open("file.zst", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
gzip dan xz menggunakan panggilan sistem yang serupa, tetapi mereka menggunakan mode 0600. Mereka mengalihkan mode file keluaran ke mode yang diinginkan setelah file ditutup. Adakah alasan mengapa zstd menggunakan 0666? Saya pikir 0600 akan lebih baik: jangan izinkan akses baca ke pengguna lain sebelum file siap.
menjebak peristiwa ^C
membutuhkan penangan sinyal. Saya belum memeriksanya. Saya juga khawatir dengan masalah portabilitas.
Jejak Anda lebih tepat daripada kode kami.
Panggilan untuk membuka file tujuan ada di sini:
https://github.com/facebook/zstd/blob/dev/programs/fileio.c#L324
Ini hanya standar fopen("name", "wb");
, kami tidak mengontrol sedikit pun properti.
Kebetulan menerjemahkan ke dalam jejak ini di sistem Anda, ketahuilah bahwa kami tidak memiliki kendali atasnya.
Secara umum, kami mencoba untuk tetap sedekat mungkin dengan standar C, untuk alasan portabilitas (dan mengurangi sakit kepala ketergantungan).
Pertama-tama: terima kasih telah menulis zstd. Saya kagum dengan kecepatan dan rasio kompresi! Sangat bagus!
Silakan menutup tiket ini. Dua pengamatan saya hanyalah masalah kecil dan tidak masalah jika Anda memutuskan untuk tidak melakukan apa pun.
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 );
Mereka menggunakan open () daripada fopen () - dan dengan demikian dapat mengontrol bit izin dari file output.
Benar, saya yakin xz
menargetkan sistem yang sesuai dengan POSIX
,
oleh karena itu ia dapat dengan bebas menggunakan perpustakaan posix , dengan biaya tidak kompatibel dengan sistem non-posix atau memerlukan pembungkus khusus (teringat Windows).
zstd
mencoba menjadi standar-C sebanyak mungkin, untuk meningkatkan perspektif portabilitas.
Secara teknis, kami juga terkadang menggunakan beberapa antarmuka yang bergantung pada OS, ketika tidak ada standar-C yang setara. Dalam kasus seperti itu, kami mencoba menulis beberapa varian untuk mendukung beberapa target, dan untuk yang tidak didukung, fungsi yang relevan dinonaktifkan dengan bersih (cenderung tidak penting).
Setelah mempelajari lebih lanjut, tampaknya function signal()
sebenarnya adalah bagian dari standar C , yang membuatnya cukup portabel.
Dalam pembaruan cabang dev
terbaru, saya menambahkan Ctrl-C
trapping ke zstd
cli.
Saat menekan Ctrl-C
, itu sekarang menghapus artefak operasi (file tujuan yang belum selesai) sebelum keluar.