Я не до конца понимаю, что вы спрашиваете. Если бы я не знал ничего лучше, я думаю, что вы спрашивали, есть ли способ обнаружить это в разгар работы с файлом. Я не верю, что это возможно.
Единственный способ, который я могу придумать, - это найти, где вы специально начинаете просматривать определенную ветку в дереве каталогов.
пример
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
Команда find
обнаружит этот цикл, но не очень много расскажет об этом.
$ find -L . -mindepth 15
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
Я произвольно выбрал 15 уровней, чтобы заблокировать любой вывод, отображаемый find
. Однако вы можете удалить этот переключатель ( -mindepth
), если вас не волнует отображение дерева каталогов. Команда find
все еще обнаруживает цикл и останавливается:
$ find -L .
.
./a
./a/b
./a/b/c
./a/b/c/d
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
Кстати, если вы хотите переопределить значение по умолчанию, MAXSYMLINKS
которое, по-видимому, составляет 40 в Linux (более новые версии ядра 3.x), вы можете увидеть этот вопрос и ответ по U & L под названием: Как вы увеличиваете MAXSYMLINKS .
Использование команды symlinks
Существует инструмент, который могут использовать сопровождающие FTP-сайта, symlinks
который поможет выявить проблемы с длинными инструментами или висячими деревьями, которые были вызваны символическими ссылками.
В некоторых случаях этот symlinks
инструмент можно использовать и для удаления оскорбительных ссылок.
пример
$ symlinks -srv a
lengthy: /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e
Библиотека glibc
Библиотека glibc, похоже, предлагает некоторые функции C для этого, но я не совсем знаю их роль или как на самом деле их использовать. Так что я могу только указать на них.
Страница man, man symlink
показывает определение функции для вызываемой функции symlink()
. Описание выглядит так:
symlink () создает символическую ссылку с именем newpath, которая содержит строку oldpath.
Одна из ошибок гласит, что эта функция возвращает:
ELOOP Слишком много символических ссылок было найдено при разрешении newpath.
Я также направлю вас на страницу руководства, man path_resolution
где рассказывается, как Unix определяет пути к элементам на диске. Конкретно этот абзац.
If the component is found and is a symbolic link (symlink), we first
resolve this symbolic link (with the current lookup directory as starting
lookup directory). Upon error, that error is returned. If the result is
not a directory, an ENOTDIR error is returned. If the resolution of the
symlink is successful and returns a directory, we set the current lookup
directory to that directory, and go to the next component. Note that the
resolution process here involves recursion. In order to protect the
kernel against stack overflow, and also to protect against denial of
service, there are limits on the maximum recursion depth, and on the maximum
number of symbolic links followed. An ELOOP error is returned when the
maximum is exceeded ("Too many levels of symbolic links").
readlink ...
о вышеупомянутых ситуациях?