Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

link, linkat - Verweis auf eine Datei erzeugen

&pagelevel(4)&pagelevel

Definition

#include <unistd.h>

int link(const char *path1, const char *path2);
int linkat(int fd1, const char *path1, int fd2, const char *path2, int flag);

Beschreibung

link() erzeugt einen neuen Verweis (Dateiverzeichniseintrag) für die existierende Datei path1.

path1 zeigt auf einen Pfadnamen, der eine existierende Datei benennt. path2 zeigt auf einen Pfadnamen, der den neuen, zu erzeugenden Dateiverzeichniseintrag benennt. Die Funktion link() erzeugt automatisch einen neuen Verweis für die existierende Datei und der Verweiszähler dieser Datei wird um 1 erhöht.

Wenn path1 ein Dateiverzeichnis benennt, schlägt link() fehl.

Bei erfolgreicher Beendigung kennzeichnet link() die Strukturkomponente st_ctime der Datei zum Aktualisieren. Ebenso werden st_ctime und st_mtime des Dateiverzeichnisses, das den neuen Eintrag enthält, zum Aktualisieren gekennzeichnet.

Wenn die Funktion link() fehlschlägt, wird kein Verweis erzeugt und der Verweiszähler der Datei bleibt unverändert.

Der aufrufende Prozess muss das Zugriffsrecht auf die existierende Datei haben.

link() wird nicht zwischen Dateien verschiedener Dateisysteme durchgeführt.

Wenn bei einem erfolgreichen Aufruf von link(*path1, *path2 ) sowohl path1 als auch path2 auf Dateien des POSIX-Dateisystems zeigen, wird ein interner Verweiszähler um 1 erhöht. Bei einem erfolgreichen Aufruf von unlink(*path ) oder remove(*path ) wird dieser Verweiszähler um 1 vermindert. Ist dieser Zähler = 0 und die Datei nicht mehr von einem Prozess geöffnet, wird die Datei gelöscht.

Die Funktion linkat() ist äquivalent zu der Funktion link(), außer wenn symbolische Links gemäß dem im Parameter flag übergebenen Wert behandelt werden sollen (siehe unten), oder wenn der Parameter path1 oder path2 einen relativen Pfad spezifiziert. Spezifiziert path1 einen relativen Pfadnamen, wird dieser als Pfad relativ zu dem mit dem Dateideskriptor fd1 verbundenen Dateiverzeichnis interpretiert. Spezifiziert path2 einen relativen Pfadnamen, wird dieser als Pfad relativ zu dem mit dem Dateideskriptor fd2 verbundenen Dateiverzeichnis interpretiert. Wurde ein Dateideskriptor ohne O_SEARCH geöffnet, prüft die Funktion, ob eine Suche im verbundenen Dateiverzeichnis mit den dem Dateiverzeichnis zugrunde liegenden Berechtigungen erlaubt ist. Wurde der Dateideskriptor mit O_SEARCH geöffnet, unterbleibt die Prüfung.

Wenn der Funktion linkat() für den Parameter fd1 oder fd2 der Wert AT_FDCWD übergeben wurde, wird das aktuelle Dateiverzeichnis für die Ermittlung der Datei des entsprechenden Pfades verwendet.

Im Parameter flag kann der Wert AT_SYMLINK_FOLLOW übergeben werden, der im Header fnctl.h definiert ist. Falls path1 einen symbolischen Link bezeichnet, wird für das Ziel ein neuer symbolischer Link erzeugt.

Returnwert

0

bei Erfolg.

 

-1

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehler

link() und linkat() schlagen fehl, wenn gilt:

 

EACCES

Für eine Komponente des Pfades existiert kein Durchsuchrecht oder der geforderte Verweis verlangt das Schreiben in ein Dateiverzeichnis mit Zugriffsrechten, die das Schreibrecht verweigern. Oder der aufrufende Prozess besitzt nicht das Recht, auf die existierende Datei zuzugreifen.

 

EEXIST

Der durch path2 benannte Verweis existiert.


Erweiterung

 

EFAULT

path1 oder path2 weist über den zugewiesenen Adressraum hinaus.

 

EINTR

Ein Signal wurde während des Systemaufrufs link() abgefangen.

 

EINVAL

Es wurde versucht, auf eine BS2000-Datei zuzugreifen.

 

ELOOP

Beim Übersetzen von path1 oder path2 waren zu viele symbolische Verweise vorhanden. (Ende)

 

EMLINK

Die Anzahl der Verweise auf die durch path1 benannte Datei würde {LINK_MAX} überschreiten.


ENAMETOOLONG

 

Die Länge von path1 oder path2 überschreitet {PATH_MAX}, oder eine Pfadnamenkomponente ist länger als {NAME_MAX}.

 

ENOENT

Eine Komponente eines der Pfade oder die durch path1 benannte Datei existiert nicht, oder path1 oder path2 zeigt auf eine leere Zeichenkette.

 

ENOSPC

Das den Verweis enthaltende Dateiverzeichnis kann nicht erweitert werden.

 

ENOTDIR

Eine Komponente eines der Pfade ist kein Dateiverzeichnis..

 

EPERM

Die durch path1 benannte Datei ist ein Dateiverzeichnis, und der Prozess besitzt keine Sonderrechte.


EROFS

Der gewünschte Verweis erfordert das Schreiben in einem Dateiverzeichnis auf einem nur zum Lesen eingehängten Dateisystem.


EXDEV

Der durch path2 benannte Verweis und die durch path1 benannte Datei befinden sich auf verschiedenen Dateisystemen.

 

Zusätzlich schlägt linkat() fehl, wenn gilt:

 

EACCES

Der Dateideskriptor fd1 oder fd2 wurde nicht mit O_SEARCH geöffnet und die dem Dateiverzeichnis zugrunde liegenden Berechtigungen erlauben nicht das Durchsuchen des Dateiverzeichnisses.

 

EBADF

Der Parameter path1 spezifiziert keinen absoluten Pfadnamen und der Parameter fd1 hat weder den Wert AT_FDCWD, noch enthält er einen gültigen zum Lesen oder Suchen geöffneten Dateideskriptor, oder der Parameter path2 spezifiziert keinen absoluten Pfadnamen und der Parameter fd2 hat weder den Wert AT_FDCWD, noch enthält er einen gültigen zum Lesen oder Suchen geöffneten Dateideskriptor.

 

ENOTDIR

Der Parameter path1 oder path2 spezifiziert keinen absoluten Pfadnamen und der entsprechende Dateideskriptor fd1 bzw. fd2 ist nicht mit einem Dateiverzeichnis verbunden.

 

EINVAL

Der Wert des Parameters flag ist ungültig.

Hinweis

link() und linkat() werden nur für POSIX-Dateien ausgeführt.

Siehe auch

readlink(), remove, symlink(), unlink(), fcntl.h, unistd.h.