Linux上的zstd:两个观察
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。 我对速度和压缩率感到惊讶! 非常好!
请随时关闭这张票。 我的两个观察只是轻微的挑剔,如果您决定不做任何事情,那完全没问题。
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
尝试尽可能地成为Standard-C ,以改善可移植性的观点。
从技术上讲,在没有标准C等效项的情况下,我们有时还会使用一些与OS相关的接口。 在这种情况下,我们尝试编写几种变体来支持多个目标,而对于不受支持的变体,则会彻底禁用相关功能(它们往往不是必需的)。
了解更多有关它的信息之后,函数signal()
实际上是标准C的一部分,这使其非常易于移植。
在最新的dev
分支更新中,我在zstd
cli中添加了Ctrl-C
陷阱。
现在按下Ctrl-C
,它会在退出前擦除操作伪像(未完成的目标文件)。