Я не повністю розумію, про що ви просите. Якщо я не знав нічого кращого, я думаю, ви запитували, чи є спосіб виявити це в розпалі файлу. Я не вірю, що це можливо.
Єдиний метод, який я можу уявити, - це пошук, де ви спеціально починаєте переглядати певну гілку дерева дерева.
Приклад
$ 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 .
Використання команди символьних посилань
Існує інструмент, за допомогою якого сервіси 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 Занадто багато символічних посилань зустрічалося при вирішенні нового шляху.
Я також направлю вас на сторінку man, 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 ...
про вищезазначені ситуації?