Tôi không hoàn toàn hiểu những gì bạn đang hỏi. Nếu tôi không biết gì hơn, tôi nghĩ bạn đã hỏi liệu có cách nào để phát hiện ra điều này trong khi đang xử lý một tập tin hay không. Tôi không tin điều này là có thể.
Phương pháp duy nhất tôi có thể hình dung là thực hiện tìm kiếm nơi bạn đặc biệt bắt đầu tìm kiếm thông qua một nhánh cụ thể trong cây thư mục.
Thí dụ
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
Các find
lệnh sẽ phát hiện vòng lặp này, nhưng không thực sự cho bạn biết một toàn bộ rất nhiều về nó.
$ 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
Tôi tùy ý chọn 15 cấp độ để chặn bất kỳ đầu ra nào được hiển thị bởi find
. Tuy nhiên, bạn có thể bỏ công tắc đó ( -mindepth
) nếu bạn không quan tâm đến cây thư mục đang được hiển thị. Các find
lệnh vẫn phát hiện các vòng lặp và điểm dừng:
$ 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
Ngẫu nhiên, nếu bạn muốn ghi đè mặc định MAXSYMLINKS
là 40 trên Linux (phiên bản 3.x mới hơn của kernel), bạn có thể thấy Câu hỏi và trả lời của U & L này có tiêu đề: Làm thế nào để bạn tăng MAXSYMLINKS .
Sử dụng lệnh symlinks
Có một công cụ mà những người duy trì trang FTP có thể sử dụng được gọi là symlinks
sẽ giúp phơi bày các vấn đề với các cây dài hoặc treo lủng lẳng do các liên kết tượng trưng gây ra.
Trong một số trường hợp, symlinks
công cụ này cũng có thể được sử dụng để xóa các liên kết vi phạm.
Thí dụ
$ symlinks -srv a
lengthy: /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e
Thư viện glibc
Thư viện glibc có vẻ cung cấp một số chức năng C xung quanh vấn đề này, nhưng tôi hoàn toàn không biết vai trò của chúng hoặc cách sử dụng chúng thực sự. Vì vậy, tôi chỉ có thể chỉ ra chúng cho bạn.
Trang man, man symlink
hiển thị định nghĩa hàm cho một hàm được gọi symlink()
. Mô tả như sau:
symlink () tạo ra một liên kết tượng trưng có tên newpath chứa chuỗi oldpath.
Một trong những lỗi nói rằng hàm này trả về:
ELOOP Quá nhiều liên kết tượng trưng đã gặp phải trong việc giải quyết newpath.
Tôi cũng sẽ hướng dẫn bạn đến trang hướng dẫn, man path_resolution
thảo luận về cách Unix xác định đường dẫn đến các mục trên đĩa. Cụ thể đoạn này.
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 ...
nói gì về các tình huống trên?