link(2) System Calls Manual link(2) BEZEICHNUNG link, linkat - erzeugt einen neuen Verweis auf eine Datei BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int link(const char *alterpfad, const char *neuerpfad); #include /* Definition der AT_*-Konstanten */ #include int linkat(int altVerzdd, const char *alterpfad, int neuVerzdd, const char *neuerpfad, int Schalter); Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)): linkat(): Seit Glibc 2.10: _POSIX_C_SOURCE >= 200809L Vor Glibc 2.10: _ATFILE_SOURCE BESCHREIBUNG link erzeugt einen neuen Verweis (auch bekannt als harter Verweis) auf eine bestehende Datei. Wenn neuerpfad existiert, wird es nicht uberschrieben. Dieser neue Name kann genauso wie der alte Name fur alle Aktionen benutzt werden. Beide Namen zeigen auf die gleiche Datei (haben somit die gleichen Rechte und Eigentumer) und es ist unmoglich festzustellen, welcher Name das >>Original<< ist. linkat() Der Systemaufruf linkat() funktioniert genau wie link() ausser den hier beschriebenen Unterschieden. Falls der an alterpfad ubergebene Pfadname relativ ist wird er relativ zu dem von dem Dateideskriptor altVerzdd referenzierten Verzeichnis interpretiert (statt relativ zu dem aktuellen Arbeitsverzeichnis des aufrufenden Prozesses, wie es bei link() fur einen relativen Pfadnamen erfolgt). Falls alterpfad relativ ist und altVerzdd 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 altVerzdd ignoriert. Die Interpretation von neuerpfad ist wie bei alterpfad, ausser dass ein relativer Pfadname als relativ zu dem Verzeichnis interpretiert wird, auf das der Dateideskriptor neuVerzdd verweist. Die folgenden Werte konnen durch bitweises ODER in Schalter gesetzt werden: AT_EMPTY_PATH (seit Linux 2.6.39) Falls alterpfad eine leere Zeichenkette ist, wird ein Verweis auf die durch altVerzdd referenzierte Datei (die mittels des Schalter open(2) O_PATH erhalten worden sein kann) angelegt. In diesem Fall kann sich altVerzdd auf jede Art von Datei, ausser einem 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 uber die Capability CAP_DAC_READ_SEARCH verfugen, 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) Standardmassig 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 eingehangt ist, kann dies als Alternative zu AT_EMPTY_PATH verwandt werden, wie folgt: linkat(AT_FDCWD, "/proc/self/fd/", newdirfd, newname, AT_SYMLINK_FOLLOW); Vor Linux 2.6.18 wurde das Argument Schalter nicht verwandt und musste als 0 angegeben werden. Lesen Sie openat(2) fur die Erklarung der Notwendigkeit fur linkat(). RUCKGABEWERT Bei Erfolg wird Null zuruckgegeben. Bei einem Fehler wird -1 zuruckgegeben und errno gesetzt, um den Fehler anzuzeigen. FEHLER EACCES Es besteht kein Schreibzugriff auf das Verzeichnis, das neuerpfad enthalt oder es besteht kein Suchzugriff fur eines der Verzeichnisse im Pfad-Prafix von neuerpfad oder alterpfad. (Siehe auch path_resolution(7).) EDQUOT Das Plattenkontingent (Quota) des Benutzers an Plattenblocken auf dem Dateisystem ist erschopft. EEXIST neuerpfad ist schon vorhanden. EFAULT alterpfad oder neuerpfad zeigt aus dem fur Sie zuganglichen Adressraum heraus. EIO Es ist ein E/A-Fehler (engl. I/O) aufgetreten. ELOOP Bei der Auflosung von alterpfad oder neuerpfad wurden zu viele symbolische Links gefunden. EMLINK Die durch alterpfad referenzierte Datei hat bereits die maximale Anzahl an Links auf sich. Beispielsweise ist die Begrenzung der Anzahl der Hartlinks auf eine Datei 65.000 auf einem ext4(5)-Dateisystem, das nicht die Funktionalitat dir_index einsetzt, und unter btrfs(5) ist die Begrenzung 65.535 Links. ENAMETOOLONG alterpfad oder neuerpfad war zu lang. ENOENT Eine Verzeichniskomponente in alterpfad oder neuerpfad existiert nicht oder ist ein toter symbolischer Verweis. ENOMEM Es war nicht genugend Kernelspeicher verfugbar. ENOSPC Das Gerat, das die die Datei enthalt, hat keinen Platz fur einen neuen Verzeichniseintrag. ENOTDIR Eine Komponente, die in alterpfad oder neuerpfad als Verzeichnis benutzt wird, ist tatsachlich gar kein Verzeichnis. EPERM alterpfad ist ein Verzeichnis. EPERM Das Dateisystem, welches alterpfad und neuerpfad beinhaltet, unterstutzt 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).) EPERM alterpfad ist als unveranderlich oder nur-anhangbar markiert (siehe ioctl_iflags(2)). EROFS Die Datei befindet sich auf einem nur lesbaren Dateisystem. EXDEV alterpfad und neuerpfad befinden sich nicht auf dem gleichen eingehangten Dateisystem. (Linux erlaubt es, ein Dateisystem an mehreren Punkten einzuhangen, aber link() funktioniert nicht uber mehrere unterschiedliche Einhangungen hinweg, selbst wenn das gleiche Dateisystem an beiden eingehangt ist.) Die folgenden zusatzlichen Fehler konnen bei linkat() auftreten: EBADF alterpfad (neuerpfad) ist relativ, aber altVerzdd oder neuVerzdd ist weder AT_FDCWD noch ein zulassiger Dateideskriptor. EINVAL In Schalter wurde ein ungultiger 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 Es wurde versucht, einen Verweis auf /proc/self/fd/NN zu erstellen, das zu einer geloschten Datei korrespondiert. ENOENT alterpfad ist ein relativer Pfadname und altVerzdd bezieht sich auf ein geloschtes Verzeichnis, oder neuerpfad ist ein relativer Pfadname und neuVerzdd bezieht sich auf ein geloschtes Verzeichnis. ENOTDIR alterpfad ist relativ und altVerzdd ist ein Dateideskriptor, der sich auf eine Datei bezieht, die kein Verzeichnis ist; gilt analog fur neuerpfad und neuVerzdd. EPERM AT_EMPTY_PATH wurde in Schalter angegeben, alterpfad ist eine leere Zeichenkette und altVerzdd bezieht sich auf ein Verzeichnis. VERSIONEN POSIX.1-2001 legt fest, dass link() alterpfad zuruckverfolgen sollte, wenn es ein symbolischer Verweis ist. Seit Version 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 andert die Spezifikation von link(), indem es sie von der Implementierung abhangig macht, egal ob alterpfad zuruckverfolgt wird, wenn es ein symbolischer Verweis ist, oder nicht. Fur prazise Steuerung der Behandlung symbolischer Verweise bei ihrer Erstellung verwenden Sie linkat(). Glibc Mit alteren Kernels, in denen linkat() nicht verfugbar ist, weicht die Glibc-Wrapper-Funktion auf link() aus, ausser 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 altVerzdd und neuVerzdd entsprechen. STANDARDS link() POSIX.1-2008. GESCHICHTE link() SVr4, 4.3BSD, POSIX.1-2001 (aber siehe VERSIONEN). linkat() POSIX.1-2008. Linux 2.6.16, Glibc 2.4. ANMERKUNGEN Harte Verweise, wie sie mit link() erstellt werden, konnen sich nicht uber mehrere Dateisysteme erstrecken. Benutzen Sie symlink(2), falls notig. FEHLER Auf NFS-Dateisystemen kann der Ruckgabewert falsch sein, wenn der NFS-Server beim Erzeugen des Verweises abbricht. Prufen Sie mit stat(2), ob der Verweis angelegt wurde. SIEHE AUCH ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2), path_resolution(7), symlink(7) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Elmar Jansen , Martin Schulze , Chris Leick , Mario Blattermann und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 link(2)