link(2) System Calls Manual link(2) NOM link, linkat - Creer un nouveau nom pour un fichier BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int link(const char *oldpath, const char *newpath); #include /* Definition des constantes AT_* */ #include int linkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags); Exigences de macros de test de fonctionnalites pour la glibc (consulter feature_test_macros(7)) : linkat() : Depuis la glibc 2.10 : _POSIX_C_SOURCE >= 200809L avant la glibc 2.10 : _ATFILE_SOURCE DESCRIPTION link() cree un nouveau lien (aussi appele lien materiel ou hard link) sur un fichier existant. Si newpath existe, il ne sera pas ecrase. Ce nouveau nom pourra etre utilise exactement comme l'ancien quelle que soit l'operation. Les deux noms referent au meme fichier (et ont donc les memes permissions et proprietaire) et il est impossible de determiner quel nom etait l'original. linkat() L'appel systeme linkat() fonctionne exactement comme link(), les seules differences etant celles decrites ici. Si le chemin donne dans oldpath est relatif, il est interprete par rapport au repertoire reference par le descripteur de fichier olddirfd (plutot que par rapport au repertoire courant du processus appelant, comme dans link() pour un chemin relatif). Si oldpath est relatif et olddirfd a la valeur speciale AT_FDCWD, oldpath est interprete relativement au repertoire courant du processus appelant, (comme link()). Si oldpath est un chemin absolu, olddirfd est ignore. L'interpretation de newpath est identique a celle de oldpath, excepte qu'un chemin relatif est interprete par rapport au repertoire correspondant a newdirfd. Les valeurs suivantes peuvent etre combinees avec un operateur OU bit a bit dans le parametre flags : AT_EMPTY_PATH (depuis Linux 2.6.39) Si oldpath est une chaine vide, creer un lien vers le fichier reference par olddirfd (qui peut avoir ete obtenu en utilisant open(2) avec l'attribut O_PATH). Dans ce cas, olddirfd peut faire reference a n'importe quel type de fichier a l'exception d'un repertoire. Cette operation ne fonctionne generalement pas si le nombre de liens du fichier est egal a zero (les fichiers crees par O_TMPFILE sans O_EXCL constituent une exception). L'appelant doit disposer de la capacite CAP_DAC_READ_SEARCH pour pouvoir utiliser cet attribut. Cet attribut est propre a Linux, et _GNU_SOURCE doit etre initialise pour obtenir sa definition. AT_SYMLINK_FOLLOW (depuis Linux 2.6.18) Par defaut, linkat() ne dereference pas oldpath si c'est un lien symbolique (de meme que link()). L'attribut AT_SYMLINK_FOLLOW peut etre passe dans flags pour forcer le dereferencement de oldpath si c'est un lien symbolique. Si procfs est monte, cet attribut offre une alternative a AT_EMPTY_PATH si on l'utilise de la facon suivante : linkat(AT_FDCWD, "/proc/self/fd/", newdirfd, newname, AT_SYMLINK_FOLLOW); Avant Linux 2.6.18, l'argument flags n'etait pas utilise et devait etre 0. Consultez openat(2) pour une explication de la necessite de linkat(). VALEUR RENVOYEE En cas de succes, zero est renvoye. En cas d'erreur, -1 est renvoye et errno est definie pour preciser l'erreur. ERREURS EACCES L'ecriture dans le repertoire contenant newpath n'est pas autorisee, ou l'un des repertoires ne permet pas le parcours (execution) dans le chemin d'acces de oldpath ou newpath. Consultez aussi path_resolution(7). EDQUOT Le quota de blocs de disque de l'utilisateur sur le systeme de fichiers a ete atteint. EEXIST newpath existe deja. EFAULT oldpath ou newpath pointent en dehors de l'espace d'adressage accessible. EIO Une erreur d'entree-sortie s'est produite. ELOOP Trop de liens symboliques ont ete rencontres en parcourant oldpath ou newpath. EMLINK Le fichier auquel renvoie oldpath a deja atteint le nombre maximal de liens vers lui. Par exemple, sur un systeme de fichiers ext4(5) qui n'utilise pas la fonctionnalite dir_index, la limite du nombre de liens materiels 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 repertoire contenu dans oldpath ou newpath n'existe pas, ou est un lien symbolique pointant nulle part. ENOMEM La memoire disponible du noyau n'etait pas suffisante. ENOSPC Le peripherique contenant le fichier n'a pas de place pour une nouvelle entree de repertoire. ENOTDIR Un element utilise comme repertoire dans oldpath ou newpath n'est pas reellement un repertoire. EPERM oldpath est un repertoire. EPERM Le systeme de fichiers contenant oldpath et newpath ne permet pas la creation de liens materiels. EPERM (depuis Linux 3.6) L'appelant n'a pas le droit pour creer un lien materiel vers ce fichier (consultez la description de /proc/sys/fs/protected_hardlinks dans proc(5)). EPERM oldpath est marque comme immuable ou seulement completable (voir ioctl_iflags(2)). EROFS Le fichier se trouve sur un systeme de fichiers en lecture seule. EXDEV oldpath et newpath ne resident pas sur le meme systeme de fichiers. (Linux permet de monter un systeme de fichiers a differents endroits, mais link() ne fonctionne pas a travers differents points de montage, meme si le meme systeme de fichiers est monte sur les deux. Les erreurs supplementaires suivantes peuvent egalement 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 indique dans flags mais l'appelant n'a pas la capacite CAP_DAC_READ_SEARCH. ENOENT Une tentative de lier vers le fichier /proc/self/fd/NN correspondant a un descripteur de fichier cree 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 a un fichier qui a ete efface. ENOENT oldpath est un chemin relatif et olddirfd fait reference a un repertoire qui a ete supprime, ou bien newpath est un chemin relatif et newdirfd fait reference a un repertoire qui a ete supprime. ENOTDIR oldpath est un chemin relatif, et olddirfd est un descripteur de fichier ne referencant pas un repertoire ; ou bien c'est le cas pour newpath et newdirfd. EPERM AT_EMPTY_PATH a ete precise dans flags, oldpath est une chaine vide, et olddirfd fait reference a un repertoire. VERSIONS Selon POSIX.1-2001, link() devrait dereferencer 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 cree comme un lien (materiel) vers le meme fichier de lien symbolique (c'est-a-dire que newpath devient un lien symbolique vers le fichier sur lequel pointe oldpath). Certaines autres implementations ont le meme comportement que Linux. POSIX.1-2008 change la specification de link(), en rendant dependant de l'implementation le fait que oldpath soit dereference s'il s'agit d'un lien symbolique. Pour un controle precis sur le traitement des liens symboliques lors de la creation d'un lien, utilisez linkat(). glibc Sur les anciens noyaux ou linkat() n'est pas disponible, la fonction enveloppe de la glibc se rabat sur l'utilisation de link(), sauf si AT_SYMLINK_FOLLOW est indique. Quand oldpath et newpath sont des chemins relatifs, la glibc construit des chemins a partir des liens symboliques dans /proc/self/fd correspondant aux parametres olddirfd et newdirfd. STANDARDS link() POSIX.1-2008. HISTORIQUE link() SVr4, 4.3BSD, POSIX.1-2001 (mais voir VERSIONS). linkat() POSIX.1-2008. Linux 2.6.16, glibc 2.4. NOTES Les liens materiels crees par link(), ne peuvent pas s'etendre sur plusieurs systemes de fichiers. Utilisez plutot symlink(2) si cela est necessaire. BOGUES Sur les systemes de fichiers NFS, le code de retour peut etre faux si le serveur NFS a cree correctement le lien mais s'est arrete avant de donner le code de retour. Utiliser dans ce cas stat(2) pour verifier si le lien a ete effectivement cree. VOIR AUSSI ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2), path_resolution(7), symlink(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Frederic Hantrais et Jean- Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 link(2)