Почему функция readdir была добавлена ​​в интерфейс библиотеки POSIX, когда есть функция ядра readdir? - PullRequest
0 голосов
/ 22 июня 2019

Я был удивлен, обнаружив справочные страницы, содержащие записи для двух конфликтующих вариантов readdir.

в READDIR (2), в нем конкретно указано, что вы не хотите его использовать:

Это не та функция, которая вас интересует. Посмотрите на readdir (3) для интерфейса библиотеки C, соответствующей POSIX.На этой странице описан интерфейс системного вызова голого ядра, который заменяется getdents (2).

Я понимаю, что функция может стать устаревшей, когда другая функция появляется и выполняет свою работу лучше, но я незнаком с другими случаями, когда функция пользовательского пространства входит и заменяет функцию ядра с тем же именем.Есть ли известная причина, по которой он был выбран для того, чтобы идти по этому пути, а не придумывать новое имя функции (как упоминалось в справочной странице getdents при замене readdir).

Ответы [ 2 ]

2 голосов
/ 22 июня 2019

У вас это полностью задом наперед: это библиотечная функция readdir(3), которая предшествует Linux и системному вызову readdir(2), а не наоборот.

Называть системный вызов таким образом было определенно плохим решением, и, вероятно, за ним стоит история, но сейчас это в значительной степени не имеет значения, поскольку никто его не использует.

В Unix каталогами были простые файлы, отформатированные особым образом, а интерфейс системных вызовов, через который они были прочитаны, был просто read(2) [1]. В более поздних системах были введены системные вызовы, такие как getdirentries (44BSD) и getdents (SVR3), но они не были готовы или способны стандартизировать интерфейс, поэтому мы все еще застряли на высоком уровне и не работали [2] readdir(3) функция библиотеки в качестве единственного стандартного интерфейса для чтения каталога.

[1] В некоторых системах, таких как BSD, вы по-прежнему можете cat каталог, по крайней мере при использовании файловой системы по умолчанию (FFS).

[2] он сломан, потому что он небезопасен, и возвращает NULL как для ошибки, так и EOF, что означает, что единственный способ безопасного использования - сначала установить errno в 0, и проверяя его возвращаемое значение и errno впоследствии. Тьфу.

2 голосов
/ 22 июня 2019

Интерфейс программирования POSIX стабилен. Вы не просто заменяете функции без необходимости, потому что хотите реализовать бэкэнд более эффективно. Системный вызов Linux readdir никогда не реализовывал функцию readdir , поскольку он имеет неправильную подпись; это был старый неэффективный бэкэнд для реализации функции readdir. Когда появился лучший бэкэнд, он устарел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...