link
Section: System Calls (2)
Updated: 5 février 2023
Index
Return to Main Contents
NOM
link, linkat - Créer un nouveau nom pour un fichier
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#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);
Exigences de macros de test de fonctionnalités pour la glibc (consulter
feature_test_macros(7)) :
linkat() :
Depuis la version 2.10 de la glibc :
_POSIX_C_SOURCE >= 200809L
Avant la version 2.10 de la glibc :
_ATFILE_SOURCE
DESCRIPTION
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.
linkat()
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 :
- AT_EMPTY_PATH (depuis Linux 2.6.39)
-
Si oldpath est une chaîne vide, créer un lien vers le fichier référencé
par olddirfd (qui peut avoir été obtenu en utilisant open(2) avec
l'attribut O_PATH). Dans ce cas, olddirfd peut faire référence à
n'importe quel type de fichier à l’exception d’un répertoire. Cette
opération ne fonctionne généralement pas si le nombre de liens du fichier
est égal à zéro (les fichiers créés par O_TMPFILE sans O_EXCL
constituent une exception). L'appelant doit disposer de la capacité
CAP_DAC_READ_SEARCH pour pouvoir utiliser cet attribut. Cet attribut est
propre à Linux, et _GNU_SOURCE doit être initialisé pour obtenir sa
définition.
- AT_SYMLINK_FOLLOW (depuis Linux 2.6.18)
-
Par défaut, linkat() ne déréférence pas oldpath si c'est un lien
symbolique (de même que link()). L'attribut AT_SYMLINK_FOLLOW peut
être passé dans flags pour forcer le déréférencement de oldpath si
c'est un lien symbolique. Si procfs est monté, cet attribut offre une
alternative à AT_EMPTY_PATH si on l'utilise de la façon suivante :
-
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().
VALEUR RENVOYÉE
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.
ERREURS
- EACCES
-
L'écriture dans le répertoire contenant newpath n'est pas autorisée, ou
l'un des répertoires ne permet pas le parcours (exécution) dans le chemin
d’accès de oldpath ou newpath. Consultez aussi path_resolution(7).
- EDQUOT
-
Le quota de blocs de disque de l'utilisateur sur le système de fichiers a
été atteint.
- EEXIST
-
newpath existe déjà.
- EFAULT
-
oldpath ou newpath pointent en dehors de l'espace d'adressage
accessible.
- EIO
-
Une erreur d'entrée-sortie s'est produite.
- ELOOP
-
Trop de liens symboliques ont été rencontrés en parcourant oldpath ou
newpath.
- EMLINK
-
Le fichier auquel renvoie oldpath a déjà atteint le nombre maximal de
liens vers lui. Par exemple, sur un système de fichiers ext4(5) qui
n'utilise pas la fonctionnalité dir_index, la limite du nombre de liens
matériels vers un fichier est de 65 000 ; sur btrfs(5), la limite est de
65 535.
- ENAMETOOLONG
-
oldpath ou newpath est trop long.
- ENOENT
-
Un répertoire contenu dans oldpath ou newpath n'existe pas, ou est un
lien symbolique pointant nulle part.
- ENOMEM
-
La mémoire disponible du noyau n'était pas suffisante.
- ENOSPC
-
Le périphérique contenant le fichier n'a pas de place pour une nouvelle
entrée de répertoire.
- ENOTDIR
-
Un élément utilisé comme répertoire dans oldpath ou newpath n'est pas
réellement un répertoire.
- EPERM
-
oldpath est un répertoire.
- EPERM
-
Le système de fichiers contenant oldpath et newpath ne permet pas la
création de liens matériels.
- EPERM (depuis Linux 3.6)
-
L'appelant n'a pas le droit pour créer un lien matériel vers ce fichier
(consultez la description de /proc/sys/fs/protected_hardlinks dans
proc(5)).
- EPERM
-
oldpath est marqué comme immuable ou seulement complétable (voir
ioctl_iflags(2)).
- EROFS
-
Le fichier se trouve sur un système de fichiers en lecture seule.
- EXDEV
-
oldpath et newpath ne résident pas sur le même système de
fichiers. (Linux permet de monter un système de fichiers à différents
endroits, mais link() ne fonctionne pas à travers différents points de
montage, même si le même système de fichiers est monté sur les deux.
Les erreurs supplémentaires suivantes peuvent également se produire pour
linkat() :
- EBADF
-
oldpath (newpath) est relatif, mais olddirfd (newdirfd) n'est ni
AT_FDCWD ni un descripteur de fichier valable.
- EINVAL
-
flags contient un drapeau non valable.
- ENOENT
-
AT_EMPTY_PATH est indiqué dans flags mais l'appelant n'a pas la
capacité CAP_DAC_READ_SEARCH.
- ENOENT
-
Une tentative de lier vers le fichier /proc/self/fd/NN correspondant à un
descripteur de fichier créé avec
-
open(path, O_TMPFILE | O_EXCL, mode);
-
Consultez open(2).
- ENOENT
-
Il y a eu une tentative de lien vers le fichier /proc/self/fd/NN
correspondant à un fichier qui a été effacé.
- ENOENT
-
oldpath est un chemin relatif et olddirfd fait référence à un
répertoire qui a été supprimé, ou bien newpath est un chemin relatif et
newdirfd fait référence à un répertoire qui a été supprimé.
- ENOTDIR
-
oldpath est un chemin relatif, et olddirfd est un descripteur de
fichier ne référençant pas un répertoire ; ou bien c'est le cas pour
newpath et newdirfd.
- EPERM
-
AT_EMPTY_PATH a été précisé dans flags, oldpath est une chaîne
vide, et olddirfd fait référence à un répertoire.
VERSIONS
linkat() a été ajouté à Linux 2.6.16 ; la prise en charge de la
bibliothèque ajoutée dans la glibc 2.4.
STANDARDS
link() : SVr4, 4.3BSD, POSIX.1-2001 (mais consultez la section NOTES),
POSIX.1-2008.
linkat() : POSIX.1-2008.
NOTES
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().
Notes de la glibc
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.
BOGUES
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éé.
VOIR AUSSI
ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2),
path_resolution(7), symlink(7)
TRADUCTION
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 à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- linkat()
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- VERSIONS
-
- STANDARDS
-
- NOTES
-
- Notes de la glibc
-
- BOGUES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 09:21:04 GMT, May 23, 2024