Nie do końca rozumiem, o co pytasz. Gdybym nie wiedział nic lepszego, myślę, że pytałeś, czy istnieje sposób na wykrycie tego w trakcie zajmowania się plikiem. Nie wierzę, że to jest możliwe.
Jedyną metodą, jaką mogę sobie wyobrazić, jest znalezienie, w którym konkretnie zaczniesz przeglądać określoną gałąź w drzewie katalogów.
Przykład
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
find
Polecenie wykryje tę pętlę, ale naprawdę nie powiedzieć dużo o niej.
$ 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
Dowolnie wybrałem 15 poziomów, aby zablokować wszelkie dane wyjściowe wyświetlane przez find
. Możesz jednak zrezygnować z przełącznika ( -mindepth
), jeśli nie zależy Ci na wyświetleniu drzewa katalogów. find
Komenda nadal wykrywa pętli i przystanków:
$ 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
Nawiasem mówiąc, jeśli chcesz zastąpić wartość domyślną, MAXSYMLINKS
która najwyraźniej wynosi 40 w systemie Linux (nowsze wersje jądra 3.x), możesz zobaczyć następujące pytania i odpowiedzi U&L zatytułowane: Jak zwiększyć MAXSYMLINKS .
Za pomocą polecenia symlinks
Istnieje narzędzie, którego mogą używać opiekunowie stron FTP o nazwie symlinks
które pomoże ujawnić problemy z długimi lub zwisającymi drzewami, które zostały spowodowane przez dowiązania symboliczne.
W niektórych przypadkach symlinks
narzędzie może być również użyte do usunięcia obraźliwych linków.
Przykład
$ symlinks -srv a
lengthy: /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e
Biblioteka glibc
Biblioteka glibc wygląda na to, że oferuje pewne funkcje C w tym zakresie, ale nie do końca znam ich rolę i sposób ich użycia. Więc mogę jedynie wskazać ci je.
Strona man symlink
podręcznika pokazuje definicję funkcji o nazwie symlink()
. Opis wygląda następująco:
symlink () tworzy dowiązanie symboliczne o nazwie newpath, które zawiera ciąg oldpath.
Jeden z błędów mówi, że ta funkcja zwraca:
ELOOP Napotkano zbyt wiele dowiązań symbolicznych podczas rozwiązywania nowej ścieżki.
Przekieruję cię również do strony man, man path_resolution
która omawia sposób, w jaki Unix określa ścieżki do elementów na dysku. W szczególności ten ustęp.
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 ...
mówi o powyższych sytuacjach?