Как упорядоченные записи упорядочены?

Я в растерянности относительно того, как dirent Записи заказаны. Например, если бы у меня был код

DIR* dir = opendir("/some/directory");
struct dirent* entry;

while ((entry = readdir(dir))
    printf("%s\n", entry->d_name);

Это может вывести что-то вроде следующего:

abcdef
example3
..
.
123456789
example2
example1

Как видите, этот вывод не в алфавитном порядке. Итак, мне было интересно, как именно dirent записи заказаны? Почему некоторые записи имеют более высокий приоритет, чем другие?

2 ответа

Решение

Они не заказаны каким-либо соответствующим образом. Это зависит от реализации, чтобы получать и возвращать записи каталога в любом удобном для вас порядке.

Расширенное программирование в среде UNIX, 3-е издание, идет немного дальше и даже говорит, что порядок обычно не алфавитный (глава 4, раздел 4.22):

Обратите внимание, что порядок записей в каталоге зависит от реализации и обычно не в алфавитном порядке.

Если вам интересно, вывод ls сортируется потому что ls сортирует это.

Они не упорядочены по алфавиту; они извлекаются в том порядке, в котором их поддерживает файловая система.

Каталог "файл" просто содержит список имен файлов и номеров узлов. Для некоторых типов файловых систем файловая система предпочитает не разбивать значение имени файла / индекса по блокам. Поскольку файловая система добавляет или удаляет файлы из списка, она может найти место в одном из блоков. Возможны и другие схемы (например, часто используемые имена файлов находятся в начале списка).

Список, отсортированный по имени файла, зависит от способа сортировки: он может зависеть от локали. (Файловая система не знает или не заботится о ваших настройках locale). Так что это решение остается за приложениями, а не за самой файловой системой.

Для дополнительных комментариев, см.

Другие вопросы по тегам