Other Alias
linkatÜBERSICHT
#include <unistd.h>
int link(const char *alterpfad, const char *neuerpfad);
#include <fcntl.h> /* Definition der AT_*-Konstanten */
#include <unistd.h>
int linkat(int olddirfd, const char *alterpfad,
int newdirfd, const char *neuerpfad, int Schalter);
Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):
linkat():
-
- Seit Glibc 2.10:
- _POSIX_C_SOURCE >= 200809L
- Bis Glibc 2.10:
- _ATFILE_SOURCE
BESCHREIBUNG
link erzeugt einen neuen Verweis (auch bekannt als harter Verweis) auf eine bestehende Datei.Wenn newpath existiert, wird es nicht überschrieben.
Dieser neue Name kann genauso wie der alte Name für alle Aktionen benutzt werden. Beide Namen zeigen auf die gleiche Datei (haben somit die gleichen Rechte und Eigentümer) und es ist unmöglich festzustellen, welcher Name das »Original« ist.
linkat()
Der Systemaufruf linkat() funktioniert genau wie link() außer den hier beschriebenen Unterschieden.Falls der an alterpfad übergebene Pfadname relativ ist wird er relativ zu dem von dem Dateideskriptor olddirfd referenzierten Verzeichnis interpretiert (statt relativ zu dem aktuellen Arbeitsverzeichnis des aufrufenden Prozesses, wie es bei link() für einen relativen Pfadnamen erfolgt).
Falls alterpfad relativ ist und olddirfd den besonderen Wert AT_FDCWD annimmt wird alterpfad als relativ zu dem aktuellen Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie link()).
Falls alterpfad absolut ist wird olddirfd ignoriert.
Die Interpretation von neuerpfad ist wie bei alterpfad, außer dass ein relativer Pfadname als relativ zu dem durch den Dateideskriptor newdirfd referenzierten Verzeichnis interpretiert wird.
Die folgenden Werte können durch bitweises ODER in Schalter gesetzt werden:
- AT_EMPTY_PATH (seit Linux 2.6.39)
- Falls oldpath eine leere Zeichenkette ist, wird ein Verweis auf die durch olddirfd referenzierte Datei (die mittels des Schalter open(2) O_PATH erhalten worden sein kann) angelegt. In diesem Fall kann sich olddirfd auf jede Art von Datei, nicht nur ein Verzeichnis, beziehen. Dies funktioniert im Allgemeinen nicht, falls die Datei eine Verweiszahl von Null hat (Dateien, die mit O_TMPFILE und ohne O_EXCL erstellt wurden, sind eine Ausnahme). Der Aufrufer muss über die Capability CAP_DAC_READ_SEARCH verfügen, damit er den Schalter verwenden kann. Dieser Schalter ist Linux-spezifisch; definieren Sie _GNU_SOURCE, um die Definition zu erhalten.
- AT_SYMLINK_FOLLOW (seit Linux 2.6.18)
-
Standardmäßig dereferenziert linkat() alterpfad nicht, falls dieser
ein symbolischer Verweis ist (wie link()). Der Schalter
AT_SYMLINK_FOLLOW kann in Schalter angegeben werden, damit
alterpfad dereferenziert wird, falls er ein symbolischer Verweis
ist. Falls procfs eingehängt ist, kann dies als Alternative zu
AT_EMPTY_PATH verwandt werden, wie folgt:
linkat(AT_FDCWD, "/proc/self/fd/<fd>", newdirfd, newname, AT_SYMLINK_FOLLOW);
Vor Kernel 2.6.18 wurde das Argument Schalter nicht verwandt und musste als 0 angegeben werden.
Lesen Sie openat(2) für die Erklärung der Notwendigkeit für linkat().
RÜCKGABEWERT
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.FEHLER
- EACCES
- Es besteht kein Schreibzugriff auf das Verzeichnis, das neuerpfad enthält oder es besteht kein Suchzugriff für eines der Verzeichnisse im Pfad-Präfix von neuerpfad oder alterpfad. (Siehe auch path_resolution(7).)
- EDQUOT
- Das Quota (Plattenkontingent) des Benutzers an Plattenblöcken auf dem Dateisystem ist erschöpft.
- EEXIST
- newpath ist schon vorhanden.
- EFAULT
- alterpfad oder neuerpfad zeigt aus dem für Sie zugänglichen Adressraum heraus.
- EIO
- Es ist ein E/A-Fehler (engl. I/O) aufgetreten.
- ELOOP
- Bei der Auflösung von oldpath oder newpath wurden zu viele symbolische Links gefunden.
- EMLINK
- Die Datei, auf die alterpfad zeigt, hat schon die maximale Anzahl Verweise.
- ENAMETOOLONG
- oldpath oder newpath war zu lang.
- ENOENT
- Eine Verzeichniskomponente in alterpfad oder neuerpfad existiert nicht oder ist ein toter symbolischer Verweis.
- ENOMEM
- Es war nicht genügend Kernel-Speicher verfügbar.
- ENOSPC
- Das Gerät, das die die Datei enthält, hat keinen Platz für einen neuen Verzeichniseintrag.
- ENOTDIR
- Eine Komponente, die in alterpfad oder neuerpfad als Verzeichnis benutzt wird, ist tatsächlich gar kein Verzeichnis.
- EPERM
- alterpfad ist ein Verzeichnis.
- EPERM
- Das Dateisystem, welches alterpfad und neuerpfad beinhaltet, unterstützt nicht das Erzeugen von harten Verweisen.
- EPERM (seit Linux 3.6)
- Der Aufrufende hat nicht das Recht, einen harten Verweis auf diese Datei zu erstellen. (Lesen Sie die Beschreibung von /proc/sys/fs/protected_hardlinks in proc(5).)
- EROFS
- Die Datei befindet sich auf einem nur lesbaren Dateisystem.
- EXDEV
- alterpfad und neuerpfad befinden sich nicht auf dem gleichen eingehängten Dateisystem. (Linux erlaubt es, ein Dateisystem an mehreren Punkten einzuhängen, aber link() funktioniert nicht über mehrere unterschiedliche Einhängepunkte hinweg, selbst wenn das gleiche Dateisystem an beiden eingehängt ist.)
Die folgenden zusätzlichen Fehler können bei linkat() auftreten:
- EBADF
- olddirfd oder newdirfd ist kein zulässiger Dateideskriptor.
- EINVAL
- In Schalter wurde ein ungültiger Schalterwert angegeben.
- ENOENT
- AT_EMPTY_PATH wurde in Schalter angegeben, aber der Aufrufende hatte nicht die Capability CAP_DAC_READ_SEARCH.
- ENOENT
-
Es wurde versucht, einen Verweis auf /proc/self/fd/NN zu erstellen, das
zu dem wie folgt erstellten Dateideskriptor korrespondiert:
open(path, O_TMPFILE | O_EXCL, mode);Siehe open(2).
- ENOENT
- alterpfad ist ein relativer Pfadname und olddirfd bezieht sich auf ein gelöschtes Verzeichnis, oder neuerpfad ist ein relativer Pfadname und newdirfd bezieht sich auf ein gelöschtes Verzeichnis.
- ENOTDIR
- alterpfad ist relativ und olddirfd ist ein Dateideskriptor, der sich auf eine Datei bezieht, die kein Verzeichnis ist; gilt analog für neuerpfad and newdirfd.
- EPERM
- AT_EMPTY_PATH wurde in Schalter angegeben, alterpfad ist eine leere Zeichenkette und olddirfd bezieht sich auf ein Verzeichnis.
VERSIONEN
linkat() wurde zu Linux in Kernel 2.6.16 hinzugefügt; Bibliotheksunterstützung wurde zu Glibc in Version 2.4 hinzugefügt.KONFORM ZU
link(): SVr4, 4.3BSD, POSIX.1-2001 (lesen Sie aber auch die ANMERKUNGEN), POSIX.1-2008.linkat(): POSIX.1-2008.
ANMERKUNGEN
Harte Verweise, wie sie mit link() erstellt werden, können sich nicht über mehrere Dateisysteme erstrecken. Benutzen Sie symlink(2), falls nötig.POSIX.1-2001 legt fest, dass link() alterpfad zurückverfolgen sollte, wenn es ein symbolischer Verweis ist. Seit Kernel 2.0 tut Linux dies jedoch nicht: Wenn alterpfad ein symbolischer Verweis ist, dann wird neuerpfad als (harter) Verweis auf die gleiche symbolische Verweisdatei erstellt (d.h. neuerpfad bekommt einen symbolischen Verweis auf die gleiche Datei, auf die sich alterpfad bezieht). Einige andere Implementierungen verhalten sich ebenso wie Linux. POSIX.1-2008 ändert die Spezifikation von link(), indem es sie von der Implementierung abhängig macht, egal ob alterpfad zurückverfolgt wird, wenn es ein symbolischer Verweis ist, oder nicht. Für präzise Steuerung der Behandlung symbolischer Verweise bei ihrer Erstellung verwenden Sie linkat(2).
Anmerkungen zur Glibc
Mit älteren Kernels, in denen linkat() nicht verfügbar ist, weicht die Glibc-Wrapper-Funktion auf link() aus, außer wenn AT_SYMLINK_FOLLOW angegeben wird. Wenn alterpfad und neuerpfad relative Pfadnamen sind, dann konstruiert die Glibc Pfadnamen, die auf jenen symbolischen Links in /proc/self/fd basieren, die den Argumenten olddirfd und newdirfd entsprechen.FEHLER
Auf NFS-Dateisystemen kann der Rückgabewert falsch sein, wenn der NFS-Server beim Erzeugen des Verweises abbricht. Prüfen Sie mit stat(2), ob der Verweis angelegt wurde.KOLOPHON
Diese Seite ist Teil der Veröffentlichung 4.06 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Elmar Jansen <[email protected]>, Martin Schulze <[email protected]>, Chris Leick <[email protected]>, Mario Blättermann <[email protected]> und Helge Kreutzmann <[email protected]> erstellt.Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <[email protected]>.