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

问题描述 投票:1回答:1

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

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

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

是,我知道我使用了NOSORT,但我不想使用[[sorting。但是,顺序是100%可重复的:

[每次我在Trusty上运行时,我都会在A之前获得3,并且每次在Bionic上运行时,我都会在3之前获得A

glob手册描述的行为是:

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

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

c ubuntu filesystems glob
1个回答
0
投票
自然顺序是文件系统层从对getdents()的调用返回的内容。那里的目录索引不是排序的,而是以某种优化的数据结构来按

name查找。因此,从理论上讲,枚举的顺序可以从一个时刻到另一个时刻变化。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.