Wenn sein Ziel gelöscht wird, erscheint eine Entität in /proc/$PID/fd/
bei der Verwendung von ls(1)
oder als defekter symbolischer Link. Sie file(1)
wird jedoch beim Öffnen mit anders dargestellt open(2)
.
Auf meinem Debian 9 habe ich strace(1)
gesehen, was passiert, wenn ich versuche, einen Symlink zu lesen. Der Befehl lautet sudo strace cat "$symlink"
. Die relevante Zeile von stderr lautet
entweder OK
open("$symlink", O_RDONLY) = 3
oder
ENOENT
open("$symlink", O_RDONLY) = -1 ENOENT (No such file or directory)
(Anmerkung: Ich sage nicht, dass dies open(2)
im Allgemeinen alle möglichen Ergebnisse sind ).
Die Ergebnisse:
| regular symlink | /proc/$PID/fd/$N | ---------------+-----------------+------------------+ exists, valid | OK | OK | exists, broken | ENOENT | OK | <- the difference doesn't exist | ENOENT | ENOENT | ---------------+-----------------+------------------+
Ich habe auch gelernt, dass, wenn ich laufe file "$symlink"
, ruft sie lstat(2)
, readlink(2)
und stat(2)
. Dies sind Systemaufrufe, die auf Pfaden und nicht auf Dateideskriptoren basieren. Wenn der Symlink existiert (gültig oder defekt), open(2)
wird er niemals aufgerufen, um ihn oder sein Ziel zu öffnen. ENOENT
from stat(2)
zeigt an, dass die Verbindung unterbrochen ist.
Meine Schlussfolgerung lautet: "Defekter Link" ist eine Eigenschaft, die von der Ausgabe einiger Systemaufrufe abgeleitet wird. aber wenn Sie öffnen einen Link aus /proc/$PID/fd/
, open(2)
nur weiß, was damit zu tun und kümmert sich nicht darum, was anderes Werkzeug (e) ergeben würde.
Beachten Sie das ganze /proc
nur ein "normales" Dateisystem. Wenige Macken:
- Dateien können dynamischen Inhalt haben, sie werden jedoch nicht mit Systemaufrufen geändert (try
inotifywait
). - Objekte können (dis) erscheinen, werden jedoch nicht mit Systemaufrufen (erneut
inotifywait
) erstellt oder gelöscht . - In gewissem Sinne existieren Objekte möglicherweise nicht, bis Sie mit ihnen interagieren. Lauf
bash
und warte ein paar Minuten. Rufen Siels -l /proc/$$/fd
auf, um die Dateideskriptoren anzuzeigen. Wahrscheinlich werden ctimes "diesen Moment" zeigen. Wenn Sie den Befehl jedoch alle paar Sekunden wiederholen, werden Sie feststellen, dass sich die Zeiten nicht ändern. (Trivia: Zuerst dachte ich, ich könnte diese Frage beantworten. Bestimmen Sie, wie lange eine Datei mitstat
Symlinks in geöffnet ist,/proc/$PID/fd/
aber ich habe mich geirrt; jetzt wissen Sie warum).
Kein Wunder, dass sich diese Symlinks, nach denen Sie gefragt werden, unter bestimmten Umständen nicht wie normale Symlinks verhalten. Das Ganze /proc
sollte sich etwas anders verhalten. Ich nehme an, es open(2)
wurde absichtlich die Fähigkeit gegeben, daraus Nutzen zu ziehen.