Ich habe mich gefragt, ob es eine Möglichkeit gibt, dies zu registrieren, aber da die meisten modernen Suchmaschinen mit Phrasen von mehr als 5 Wörtern nicht gut funktionieren, brauche ich Hilfe.
Ich habe mich das gefragt, weil ich ein Bash-Skript mache, das Dateien als bestimmte Typen registrieren und entsprechende Entscheidungen treffen muss. Das ist technisch nicht wichtig für mein Projekt, aber ich war neugierig.
Gibt es eine Möglichkeit, zu überprüfen, ob diese Dateien fest verknüpft sind, ohne sie analysieren zu müssen, wenn sie als reguläre Dateien betrachtet werden ls -i
? Und gibt es eine Möglichkeit zu überprüfen, ob eine beliebige Datei, X, fest mit einer anderen beliebigen Datei, Y, verknüpft ist, ohne den find -i
Befehl zu verwenden?
quelle
Antworten:
In Unix-artigen Systemen wird die Datenstruktur, die Dateisystemobjekte darstellt (mit anderen Worten, die Daten zu einer Datei), in einer sogenannten "Inode" gespeichert.
Ein Dateiname ist nur eine Verknüpfung zu diesem Inode und wird als "harte Verknüpfung" bezeichnet. Es gibt keinen Unterschied zwischen dem Vornamen einer Datei und einem nachfolgenden Link. Die Antwort lautet also "Ja": Ein fester Link ist eine reguläre Datei, und tatsächlich ist eine reguläre Datei ein fester Link.
Der
ls
Befehl zeigt Ihnen, wie viele feste Links zu der Datei vorhanden sind.Beispielsweise:
Hier haben wir eine Datei namens erstellt
/tmp/hello.txt
. Das1
in der Ausgabe vonls -l
gibt an, dass 1 fester Link zu dieser Datei vorhanden ist. Dieser feste Link ist der Dateiname/tmp/hello.txt
.Wenn wir jetzt einen weiteren festen Link zu dieser Datei erstellen:
Sie können jetzt sehen, dass beide Dateinamen darauf hinweisen, dass es zwei feste Links zu der Datei gibt. Keiner von beiden ist der "richtige" Dateiname, beide sind gleichermaßen gültig. Wir können sehen, dass beide auf dieselbe Inode verweisen (in diesem Fall 5374043):
Es gibt ein weit verbreitetes Missverständnis, dass dies für Verzeichnisse anders ist. Ich habe gehört, dass die Anzahl der von
ls
einem Verzeichnis zurückgegebenen Links der Anzahl der Unterverzeichnisse entspricht, einschließlich.
und..
was falsch ist . Oder zumindest, obwohl es Ihnen die richtige Nummer gibt, ist es aus den falschen Gründen richtig!Wenn wir ein Verzeichnis erstellen und ein tun, erhalten
ls -ld
wir:Dies zeigt, dass es 2 feste Links zu diesem Verzeichnis gibt. Diese sind:
Beachten Sie, dass
/tmp/testdir/..
ist nicht ein Link zu diesem Verzeichnis, es ist ein Link zu/tmp
. Und das sagt Ihnen, warum die Sache "Anzahl der Unterverzeichnisse" funktioniert. Wenn wir ein neues Unterverzeichnis erstellen:Sie können jetzt sehen, dass es 3 feste Verbindungen zum
/tmp/testdir
Verzeichnis gibt. Diese sind:Jedes neue Unterverzeichnis erhöht also die Anzahl der Links aufgrund des
..
darin enthaltenen Eintrags um eins .quelle
Harte Links zählen als das, womit sie verbunden sind. Sie können auf alles im selben Dateisystem verlinken.
Jeder Hardlink zu irgendetwas ist gleichwertig, das zugrunde liegende Objekt bleibt bestehen, solange es überhaupt einen (edit: nicht symbolischen) Link dazu gibt (sogar einen offenen Dateideskriptor, für den ich peinlich bin, sehr dankbar).
Das System erzwingt Regeln für Verzeichnisverknüpfungen, Sie erhalten eine benannte Verknüpfung zu einem Verzeichnis und das System fügt automatisch die eingebettete
.
Verknüpfung und die Verknüpfungen aller Unterverzeichnisse hinzu..
(beachten Sie, dass.
in der obigen Liste zwei Verknüpfungen aufgeführt sind), dies ist jedoch bei einigen modifizierten eine explizite Prüfung Benutzer mit Systemprivilegien, die versprechen, keine Schleifen zu bilden, können selbst neue Links hinzufügen. Das Dateisystem kümmert sich nicht darum, es kann beliebige Verzeichnisgraphen darstellen, aber niemand will damit umgehen.Es gibt (viele Nicht-Unix-) Dateisysteme, die auf diese Weise nicht funktionieren, einschließlich einiger, die das, was sie anbieten, als Ersatz für "harte Links" bezeichnen. Wenn ich mich richtig erinnere, hat OS X ein Äquivalent zu HFS + (das sie nicht von Haus aus hat) herausgesucht. Ich weiß nicht, wie genau es die Semantik hier bewahrt.
quelle
./tsock
eigentlich überhauptsocket()
Erstellt einen tatsächlichen Socket,bind()
gibt ihm einen bestimmten Namen undconnect()
verbindet einen von Ihnen erstellten Socket mit einem benannten Socket. Verschiedene Arten von Sockets verwenden verschiedene Arten von Namen, wie zB Internet Sockets verwenden Internet - Adressen, aber sie alle teilen gemeinsame API (einschließlichread()
undwrite()
es macht mich traurig , dass Sie nicht könnenopen()
ein Dateisystem Sockel und das Betriebssystem oder libc tunsocket()
undconnect()
für Sie) .man 7 socket
Darüber hinaus sorgen alle Netzwerkprotokolle für eine unruhige Manpage.