Zstd: gzip和zstd之间的区别

创建于 2017-09-19  ·  4评论  ·  资料来源: facebook/zstd

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会更好:在文件准备好之前,不允许其他用户进行读取访问。

feature request question

所有4条评论

  1. 捕获^C事件需要一个信号处理程序。 我还没有研究。 我也担心便携性问题。

  2. 您的跟踪比我们的代码更精确。
    打开目标文件的调用在这里:
    https://github.com/facebook/zstd/blob/dev/programs/fileio.c#L324
    它只是一个标准的fopen("name", "wb"); ,我们不控制任何属性位。
    它碰巧转化为您系统上的此跟踪,只需知道我们无法控制它。
    通常,出于可移植性的原因(并减少了依赖性问题),我们尝试保持与标准C的距离尽可能近。

首先:感谢您编写zstd。 我对速度和压缩率感到惊讶! 非常好!

请随时关闭这张票。 我的两个观察只是轻微的挑剔,如果您决定不做任何事情,那完全没问题。

  1. 我同意捕获^ C需要一个信号处理程序。
  2. 有趣的。 我查看了xz的源代码,他们使用以下代码打开了输出文件:
      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 ,它会在退出前擦除操作伪像(未完成的目标文件)。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

escalade picture escalade  ·  3评论

animalize picture animalize  ·  3评论

indygreg picture indygreg  ·  3评论

rgdoliveira picture rgdoliveira  ·  3评论

AbdulrahmanAltabba picture AbdulrahmanAltabba  ·  3评论