“未排序”订单来自Glob哪里?

时间:2019-12-05 09:24:56

标签: c ubuntu filesystems glob

我一直在阅读glob中的an implementation,并使用Ubuntu Bionic和Trusty对其进行测试。

在较高级别,我使用/foo/*/bar标志针对两个目录测试了诸如GLOB_NOSORT之类的模式:

  • /foo/A/bar/
  • /foo/3/bar/

是的,我知道我使用NOSORT,并且我不想排序。但是,订单是100%可重复的:

每次我在Trusty上运行时,我都会在A之前得到3,每次在Bionic上运行时,我都会在3之前得到A

glob手册描述的行为是:

  

不对返回的列表进行排序。默认情况下,列表按字母顺序排序。此标志使文件按照在目录中找到的顺序返回。

但是,在目录中找到它们的顺序是什么?该“自然”命令来自何处,为什么它总是可重复的,为什么在这两个OS版本之间会发生变化?

1 个答案:

答案 0 :(得分:1)

自然的顺序是文件系统层从对getdents()的调用返回的内容。那里的目录索引没有排序,但是以某种优化的数据结构来按 name 查找。因此,从理论上讲,枚举的顺序可以从一个时刻到另一个时刻。

此外,对于ext4,您不能假设任何特定顺序,即使它在每次调用之间都保持稳定。只要没有写入任何内容,它通常是稳定的,但即使这样也不能保证。

内核版本的差异还涉及对ext4代码库的大量修改;我想很难(但并非不可能)在某处发现代码中的差异,这就是导致观察顺序差异的原因。