Почему C readlink () имеет ELOOP в качестве возможной ошибки - PullRequest
0 голосов
/ 10 ноября 2018

Фон

Я читал об Открытой Спецификации Группы о readlink () , и есть ошибка под названием ELOOP, которая указывает, что «В символьных ссылках, встречающихся при разрешении аргумента пути, существует цикл»., поэтому я предполагаю, что эта функция будет продолжать разрешение пути до тех пор, пока не будет обнаружен файл без ссылок.

Однако я провел эксперимент и обнаружил, что readlink() разрешает только переданный аргумент path и просто останавливается на нем, но не продолжает разрешать, пока не достигнет файла без ссылки.

Моя проблема

  1. Если это для realpath(), то имеет смысл иметь ELOOP в качестве возможной ошибки. Но почему ELOOP существует даже для readlink(), а путь разрешается только один раз?
  2. Я видел это в спецификации «Необязательное условие ошибки [ELOOP] добавлено для согласования с черновым стандартом IEEE P1003.1a», означает ли это поведение readlink() (продолжает ли оно разрешаться до достижения не- файл ссылки) зависит от реализации?

моя версия gcc 8.2.1

1 Ответ

0 голосов
/ 10 ноября 2018

readlink дает вам непосредственную цель символической ссылки. Но что, если для разрешения пути к символической ссылке используется другая символическая ссылка?

Взять readlink("/foo/bar") в качестве примера. Предполагается, что целевая ссылка должна возвращать bar, но если /foo является символической ссылкой, указывающей на себя, вы получите ELOOP, потому что readlink должен разрешить часть каталога, прежде чем перейти к окончательной записи.

См. Также man path_resolution.

...