Ne istediğini tam olarak anlamıyorum. Daha iyi bilmiyorsam, bir dosya ile uğraşırken bunu tespit etmenin bir yolu olup olmadığını sorduğunuzu düşünüyorum. Bunun mümkün olduğuna inanmıyorum.
Anlayabildiğim tek yöntem, özellikle dizin ağacındaki belirli bir dalı aramaya başladığınız bir bulma işlemi yapmaktır.
Misal
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
find
Komut bu döngü algılar ama gerçekten size bu konuda bir sürü haber.
$ 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
Tarafından görüntülenen herhangi bir çıkışı engellemek için keyfi olarak 15 seviye seçtim find
. Bununla birlikte -mindepth
, görüntülenen dizin ağacını önemsemiyorsanız bu switch'i ( ) bırakabilirsiniz . find
Komut hala döngü ve durur algılar:
$ 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
Bu arada, MAXSYMLINKS
Linux'ta görünüşte 40 olan varsayılanı geçersiz kılmak istiyorsanız (çekirdeğin yeni 3.x sürümleri) şu U&L Soru-Cevap başlıklı başlığı görebilirsiniz: MAXSYMLINKS'i nasıl artırırsınız ?
Symlinks komutunu kullanma
FTP site bakımcılarının kullanabileceği bir araç var, symlinks
bu da sembolik bağlantıların neden olduğu araç uzun veya sarkan ağaçlarla ilgili sorunları ortaya çıkarmaya yardımcı olacak.
Belirli durumlarda symlinks
araç, rahatsız edici bağlantıları silmek için de kullanılabilir.
Misal
$ 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 Kütüphanesi
Glibc kütüphanesi bu konuda bazı C işlevleri sunuyor gibi görünüyor, ancak rollerini ya da gerçekte nasıl kullanacaklarını bilmiyorum. Sadece onları size gösterebilirim.
Man sayfası, man symlink
adlı bir fonksiyonun fonksiyon tanımını gösterir symlink()
. Açıklama şu şekilde:
symlink (), oldpath dizesini içeren newpath adında sembolik bir bağlantı oluşturur.
Hatalardan biri, bu işlevin döndürdüğünü belirtir:
ELOOP Yeni yolun çözümünde çok fazla sembolik bağlantıyla karşılaşıldı.
Ayrıca sizi man path_resolution
Unix'in diskteki öğelere giden yolları nasıl belirlediğini tartışan man sayfasına yönlendireceğim . Özellikle bu paragraf.
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 ...
yukarıdaki durumlar hakkında ne diyor?