zstd على Linux: ملاحظتان
1) إذا بدأت gzip لضغط ملف كبير وإذا قمت بقتل gzip باستخدام ^ C ، فسيحذف 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. أنا مندهش من نسبة السرعة والضغط! لطيف جدا!
لا تتردد في إغلاق هذه التذكرة. ملاحظتي ليست سوى قطع صغيرة ، ولا بأس إذا قررت عدم فعل أي شيء.
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 );
يستخدمون open () بدلاً من fopen () - وبالتالي يمكنهم التحكم في بتات الأذونات لملف الإخراج.
حسنًا ، أعتقد أن xz
يستهدف أنظمة متوافقة مع POSIX
،
ومن ثم يمكن استخدام مكتبات posix بحرية ، على حساب عدم توافقها مع أنظمة غير posix أو تتطلب أغلفة مخصصة (يتبادر إلى الذهن Windows).
يحاول zstd
أن يكون معيار C قدر الإمكان لتحسين منظور قابلية النقل.
من الناحية الفنية ، نستخدم أحيانًا بعض الواجهات المعتمدة على نظام التشغيل ، عندما لا يكون هناك مكافئ قياسي- C. في مثل هذه الحالة ، نحاول كتابة العديد من المتغيرات لدعم أهداف متعددة ، وبالنسبة للأهداف غير المدعومة ، يتم تعطيل الوظائف ذات الصلة بشكل نظيف (تميل إلى أن تكون غير أساسية).
بعد تعلم المزيد عنها ، يبدو أن الوظيفة signal()
هي في الواقع جزء من المعيار C ، مما يجعلها سهلة الحمل.
في آخر تحديث للفرع dev
، أضفت Ctrl-C
trapping إلى zstd
cli.
عند الضغط على Ctrl-C
، يتم الآن مسح عنصر العملية (ملف وجهة غير مكتمل) قبل الخروج.