link(2) | System Calls Manual | link(2) |
link, linkat - Créer un nouveau nom pour un fichier
Bibliothèque C standard (libc, -lc)
#include <unistd.h>
int link(const char *oldpath, const char *newpath);
#include <fcntl.h> /* Définition des constantes AT_* */ #include <unistd.h>
int linkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags);
linkat() :
Depuis la glibc 2.10 : _POSIX_C_SOURCE >= 200809L Avant la glibc 2.10 : _ATFILE_SOURCE
link() crée un nouveau lien (aussi appelé lien matériel ou hard link) sur un fichier existant.
Si newpath existe, il ne sera pas écrasé.
Ce nouveau nom pourra être utilisé exactement comme l'ancien quelle que soit l'opération. Les deux noms réfèrent au même fichier (et ont donc les mêmes permissions et propriétaire) et il est impossible de déterminer quel nom était l'original.
L'appel système linkat() fonctionne exactement comme link(), les seules différences étant celles décrites ici.
Si le chemin donné dans oldpath est relatif, il est interprété par rapport au répertoire référencé par le descripteur de fichier olddirfd (plutôt que par rapport au répertoire courant du processus appelant, comme dans link() pour un chemin relatif).
Si oldpath est relatif et olddirfd a la valeur spéciale AT_FDCWD, oldpath est interprété relativement au répertoire courant du processus appelant, (comme link()).
Si oldpath est un chemin absolu, olddirfd est ignoré.
L'interprétation de newpath est identique à celle de oldpath, excepté qu'un chemin relatif est interprété par rapport au répertoire correspondant à newdirfd.
Les valeurs suivantes peuvent être combinées avec un opérateur OU bit à bit dans le paramètre flags :
linkat(AT_FDCWD, "/proc/self/fd/<fd>", newdirfd, newname, AT_SYMLINK_FOLLOW);
Avant Linux 2.6.18, l'argument flags n'était pas utilisé et devait être 0.
Consultez openat(2) pour une explication de la nécessité de linkat().
En cas de succès, zéro est renvoyé. En cas d'erreur, -1 est renvoyé et errno est définie pour préciser l'erreur.
Les erreurs supplémentaires suivantes peuvent également se produire pour linkat() :
open(path, O_TMPFILE | O_EXCL, mode);
linkat() a été ajouté à Linux 2.6.16 ; la prise en charge de la bibliothèque ajoutée dans la glibc 2.4.
link() : SVr4, 4.3BSD, POSIX.1-2001 (mais consultez la section NOTES), POSIX.1-2008.
linkat() : POSIX.1-2008.
Les liens matériels créés par link(), ne peuvent pas s'étendre sur plusieurs systèmes de fichiers. Utilisez plutôt symlink(2) si cela est nécessaire.
Selon POSIX.1-2001, link() devrait déréférencer oldpath s'il s'agit d'un lien symbolique. Cependant, depuis Linux 2.0, Linux ne se comporte pas comme cela : si oldpath est un lien symbolique, alors newpath est créé comme un lien (matériel) vers le même fichier de lien symbolique (c'est-à-dire que newpath devient un lien symbolique vers le fichier sur lequel pointe oldpath). Certaines autres implémentations ont le même comportement que Linux. POSIX.1-2008 change la spécification de link(), en rendant dépendant de l'implémentation le fait que oldpath soit déréférencé s'il s'agit d'un lien symbolique. Pour un contrôle précis sur le traitement des liens symboliques lors de la création d'un lien, utilisez linkat().
Sur les anciens noyaux où linkat() n'est pas disponible, la fonction enveloppe de la glibc se rabat sur l'utilisation de link(), sauf si AT_SYMLINK_FOLLOW est indiqué. Quand oldpath et newpath sont des chemins relatifs, la glibc construit des chemins à partir des liens symboliques dans /proc/self/fd correspondant aux paramètres olddirfd et newdirfd.
Sur les systèmes de fichiers NFS, le code de retour peut être faux si le serveur NFS a créé correctement le lien mais s'est arrêté avant de donner le code de retour. Utiliser dans ce cas stat(2) pour vérifier si le lien a été effectivement créé.
ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2), path_resolution(7), symlink(7)
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.
5 février 2023 | Pages du manuel de Linux 6.03 |