table of contents
- bookworm 4.18.1-1
- bookworm-backports 4.24.0-2~bpo12+1
- testing 4.24.0-2
- unstable 4.25.0-1
getcwd(3) | Library Functions Manual | getcwd(3) |
NOM¶
getcwd, getwd, get_current_dir_name - Obtenir le répertoire de travail actuel
BIBLIOTHÈQUE¶
Bibliothèque C standard (libc, -lc)
SYNOPSIS¶
#include <unistd.h>
char *getcwd(char buf[.size], size_t size); char *get_current_dir_name(void);
[[obsolète]] char *getwd(char buf[PATH_MAX]);
get_current_dir_name() :
_GNU_SOURCE
getwd() :
Depuis la glibc 2.12:
(_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200809L)
|| /* glibc >= 2.19 : */ _DEFAULT_SOURCE
|| /* glibc <= 2.19 : */ _BSD_SOURCE
Avant la glibc 2.12 :
_BSD_SOURCE || _XOPEN_SOURCE >= 500
DESCRIPTION¶
Ces fonctions renvoient une chaîne terminée par un octet NULL contenant un chemin absolu correspondant au répertoire de travail actuel du processus appelant. Le chemin est renvoyé comme résultat de la fonction et par le paramètre buf, s'il est présent.
La fonction getcwd() copie le chemin d'accès absolu du répertoire de travail courant dans la chaîne pointée par buf, qui est de longueur size.
Si la taille du chemin absolu du répertoire de travail en cours, octet NULL de fin compris, dépasse size octets, la fonction renvoie NULL et errno contient le code d'erreur ERANGE. Une application doit détecter cette erreur et allouer un tampon plus grand si besoin est.
En tant qu'extension de la norme POSIX.1-2001, la version de la glibc de getcwd() alloue le tampon dynamiquement avec malloc(3) si buf est NULL. Dans ce cas, le tampon alloué a une taille de size sauf si size vaut zéro, auquel cas buf est alloué avec la taille nécessaire. L'appelant doit libérer avec free(3) le tampon renvoyé.
get_current_dir_name() allouera avec malloc(3) une chaîne suffisamment grande pour contenir le nom du chemin absolu du répertoire de travail courant. Si la variable d'environnement PWD est configurée, et correcte, cette valeur sera renvoyée. L'appelant doit libérer avec free(3) le tampon renvoyé.
getwd() n'allouera aucune mémoire (avec malloc(3)). Le paramètre buf doit être un pointeur sur une chaîne comportant au moins PATH_MAX octets. Si la longueur du chemin absolu du répertoire de travail actuel, caractère NULL de fin compris, dépasse PATH_MAX octets, NULL est renvoyé et errno prend la valeur ENAMETOOLONG. Notez que sur certains systèmes, PATH_MAX peut ne pas être une constante connue à la compilation ; de plus, sa valeur peut dépendre du système de fichiers, consultez pathconf(3). Pour des raisons de portabilité et de sécurité, l'utilisation de getwd() est déconseillée.
VALEUR RENVOYÉE¶
En cas de succès, ces fonctions renvoient un pointeur vers une chaîne contenant le chemin du répertoire de travail actuel. Dans le cas de getcwd() et getwd() il s'agit de la même valeur que buf.
En cas d'échec, ces fonctions renvoient NULL, et remplissent errno avec le code d'erreur. Le contenu de la chaîne pointée par buf est indéfini en cas d'erreur.
ERREURS¶
- EACCES
- Impossible de lire ou de parcourir un composant du chemin d'accès.
- EFAULT
- buf pointe sur une adresse illégale.
- EINVAL
- L'argument size vaut zéro et buf n'est pas un pointeur NULL.
- EINVAL
- getwd() : buf est NULL.
- ENAMETOOLONG
- getwd() : La taille de la chaîne, terminée par un octet NULL, du chemin absolu dépasse PATH_MAX octets.
- ENOENT
- Le répertoire en cours a été supprimé.
- ENOMEM
- Plus assez de mémoire.
- ERANGE
- Le paramètre size est inférieur à la longueur du nom du chemin absolu du répertoire de travail, caractère NULL de fin compris. Allouez un tampon plus grand et réessayez.
ATTRIBUTS¶
Pour une explication des termes utilisés dans cette section, consulter attributes(7).
Interface | Attribut | Valeur |
getcwd(), getwd() | Sécurité des threads | MT-Safe |
get_current_dir_name() | Sécurité des threads | MT-Safe env |
STANDARDS¶
getcwd() se conforme à POSIX.1-2001. Notez cependant que POSIX.1-2001 laisse le comportement de getcwd() non spécifié si buf est NULL.
getwd() est présent dans POSIX.1-2001, mais marquée « LEGACY ». POSIX.1-2008 supprime la spécification de getwd() et POSIX.1-2001 ne définit aucune erreur pour getwd(). Utilisez getcwd() à la place.
get_current_dir_name() est une extension GNU.
NOTES¶
Sous Linux, ces fonctions utilisent l'appel système getcwd() (disponible depuis Linux 2.1.92). Sur des systèmes plus anciens, elles interrogeaient /proc/self/cwd. Si l'appel système et le système de fichiers proc sont absents, une implémentation générique est utilisée. Dans ce cas seulement la fonction échoue en renvoyant EACCES sous Linux.
Ces fonctions sont souvent utilisées pour sauvegarder le répertoire de travail afin d'y revenir plus tard. Ouvrir le répertoire courant (« . ») et appeler fchdir(2) pour y revenir est habituellement une alternative plus rapide et plus fiable (surtout sur d'autres systèmes que Linux) si l'on dispose de suffisamment de descripteurs de fichier.
Différences entre bibliothèque C et noyau¶
Sur Linux, le noyau fournit un appel système getcwd() que les fonctions décrites dans cette page s'efforceront d'utiliser. L'appel système prend les mêmes paramètres que les fonctions de la bibliothèque du même nom, mais il se limite à envoyer tout au plus PATH_MAX octets (avant Linux 3.12, la limite de taille du chemin renvoyé était celle de la page du système. Sur de nombreuses architectures, PATH_MAX et la taille de la page du système valent 4096 octets, mais certaines architectures ont une page plus grande). Si la taille du chemin du répertoire de travail actuel dépasse cette limite, l'appel système échoue avec l'erreur ENAMETOOLONG. Dans ce cas, les fonctions de la bibliothèque se rabattent sur une autre implémentation (plus lente) qui renvoie tout le chemin.
Suite à un changement dans Linux 2.6.36, le chemin renvoyé par l'appel système getcwd() sera préfixé par la chaîne « (unreachable) » si le répertoire actuel ne se situe pas sous la racine du processus actuel (par exemple parce que le processus a défini un nouveau système de fichiers racine en utilisant chroot(2) sans transférer son dossier actuel dans cette racine). Un tel comportement peut aussi être causé par un utilisateur non privilégié qui va du répertoire actuel vers un autre espace de noms de montage. Quand ils ont affaire à un chemin issu de sources non fiables, les appelants des fonctions décrites dans cette page doivent envisager de vérifier si le chemin renvoyé commence par « / » ou « ( » pour éviter d'interpréter à tort un chemin non atteignable comme un chemin relatif.
BOGUES¶
Depuis une modification dans Linux 2.6.36, qui a ajouté « (unreachable) », getcwd() de la glibc échoue pour se conformer à POSIX et renvoie un chemin relatif quand l'API a besoin d'un chemin absolu. Depuis la glibc 2.27, c'est corrigé ; l'appel getcwd() à partir d'un tel endroit échouera avec ENOENT.
VOIR AUSSI¶
pwd(1), chdir(2), fchdir(2), open(2), unlink(2), free(3), malloc(3)
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> 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 |