getcwd, getwd, get_current_dir_name - das aktuelle Verzeichnis abfragen
Standard-C-Bibliothek (
libc,
-lc)
#include <unistd.h>
char *getcwd(char Puffer[.Größe], size_t Größe);
char *get_current_dir_name(void);
[[veraltet]] char *getwd(char Puffer[PATH_MAX]);
get_current_dir_name():
_GNU_SOURCE
getwd():
Seit Glibc 2.12:
(_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200809L)
|| /* Glibc >= 2.19: */ _DEFAULT_SOURCE
|| /* Glibc <= 2.19: */ _BSD_SOURCE
Vor Glibc 2.12:
_BSD_SOURCE || _XOPEN_SOURCE >= 500
Diese Funktionen geben eine Zeichenkette mit abschließender Null
zurück, die einen absoluten Pfadnamen enthält, der dem aktuellen
Arbeitsverzeichnis des aufrufenden Prozesses entspricht. Der Pfadname wird als
das Funktionsergebnis und, falls vorhanden, über das Argument
Puffer zurückgegeben.
Die Funktion
getcwd() kopiert den absoluten Pfadnamen des aktuellen
Arbeitsverzeichnisses in das Feld, auf das
Puffer zeigt und das
Größe Byte lang ist.
Falls die Länge des absoluten Pfadnamens des Arbeitsverzeichnisses,
einschließlich abschließender Null
Größe
Byte überschreitet, wird NULL zurückgegeben und
errno auf
ERANGE gesetzt. Eine Anwendung sollte prüfen, ob dieser Fehler
auftrat und falls nötig einen größeren Puffer
reservieren.
Als eine Erweiterung des POSIX.1-2001-Standards reserviert
getcwd() der
Linux-Glibc den Puffer dynamisch durch Verwendung von
malloc(3), wenn
Puffer NULL ist. In diesem Fall hat der reservierte Puffer die
Länge
Größe, sofern
Größe
nicht Null ist, wenn die für
Puffer nötige
Größe reserviert ist. Der Aufrufende sollte den
zurückgegebenen Puffer mit
free(3) freigeben.
get_current_dir_name() wird mit
malloc(3) ein Feld reservieren,
das groß genug ist, um den absoluten Pfadnamen des aktuellen
Arbeitsverzeichnisses aufzunehmen. Wenn die Umgebungsvariable
PWD
gesetzt ist und ihr Wert stimmt, dann wird dieser Wert zurückgegeben.
Der Aufrufende sollte den zurückgegebenen Puffer mit
free(3)
freigeben.
getwd() reserviert keinen Speicher mit
malloc(3). Das Argument
Puffer sollte ein Zeiger auf ein Feld mit einer Mindestlänge von
PATH_MAX Byte sein. Falls die Länge des absoluten Pfadnamens des
aktuellen Arbeitsverzeichnisses einschließlich des
abschließenden Nullbytes
PATH_MAX Byte überschreitet,
wird NULL zurückgegeben und
errno auf
ENAMETOOLONG
gesetzt. (Beachten Sie, dass
PATH_MAX auf einigen Systemen zur
Kompilierzeit möglicherweise keine Konstante ist; außerdem
hängt ihr Wert vom Dateisystem ab – siehe
pathconf(3).)
Aus Gründen der Portierbarkeit und Sicherheit ist die Benutzung von
getwd() missbilligt.
Bei Erfolg geben diese Funktionen einen Zeiger auf eine Zeichenkette
zurück, die den Pfadnamen des aktuellen Arbeitsverzeichnisses
enthält. Im Fall von
getcwd() und
getwd() ist dies der
gleiche Wert wie
Puffer.
Bei einem Fehlschlag geben diese Funktionen NULL zurück und
errno
wird so gesetzt, dass es den Fehler anzeigt. Der Inhalt des Feldes, auf den
Puffer zeigt, ist bei einem Fehler nicht definiert.
- EACCES
- Lese- oder Suchberechtigung für einen Bestandteil
des Dateinamens wurde verweigert.
- EFAULT
-
Puffer zeigt auf eine falsche Adresse.
- EINVAL
- Das Argument Größe ist Null und
Puffer ist kein Nullzeiger.
- EINVAL
-
getwd(): Puffer ist NULL.
- ENAMETOOLONG
-
getwd(): Die Größe des absoluten
Pfadnamens mit abschließendem Nullbyte überschreitet
PATH_MAX Byte.
- ENOENT
- Der Link auf das aktuelle Arbeitsverzeichnis wurde
gelöst.
- ENOMEM
- Speicher aufgebraucht.
- ERANGE
- Das Argument Größe ist kleiner als die
Länge des absoluten Pfadnamens des aktuellen Arbeitsverzeichnisses
einschließlich abschließendem Nullbyte. Sie müssen
ein größeres Feld reservieren und es erneut versuchen.
Siehe
attributes(7) für eine Erläuterung der in diesem
Abschnitt verwandten Ausdrücke.
Schnittstelle |
Attribut |
Wert |
getcwd(), getwd() |
Multithread-Fähigkeit |
MT-Safe |
get_current_dir_name() |
Multithread-Fähigkeit |
MT-Safe env |
getcwd() ist konform zu POSIX.1-2001. Beachten Sie jedoch, dass das
Verhalten von
getcwd() unter POSIX.1-2001 nicht spezifiziert ist, wenn
Puffer NULL ist.
getwd() ist in POSIX.1-2001 vorhanden, aber als VERALTET markiert.
POSIX.1-2008 entfernt die Spezifikation von
getwd(). Benutzen Sie
stattdessen
getcwd(). POSIX.1-2001 definiert keine Fehler für
getwd().
get_current_dir_name() ist eine GNU-Erweiterung.
Unter Linux nutzen diese Funktionen den Systemaufruf
getcwd()
(verfügbar seit 2.1.92). Auf älteren Systemen würden sie
/proc/self/cwd abfragen. Falls sowohl der Systemaufruf, als auch das
»proc«-Dateisystem fehlen, wird eine allgemeine Implementierung
aufgerufen. Nur in diesem Fall können diese Systemaufrufe unter Linux
mit
EACCES fehlschlagen.
Diese Funktionen werden oft benutzt, um den Ort des aktuellen
Arbeitsverzeichnisses zum Zweck der späteren Rückkehr zu
speichern. Das aktuelle Verzeichnis ».« zu öffnen und
fchdir(2) zur Rückkehr aufzurufen ist normalerweise schneller
und eine zuverlässigere Alternative, wenn ausreichend viele
Dateideskriptoren zur Verfügung stehen, besonders auf anderen
Plattformen als Linux.
Unter Linux stellt der Kernel einen Systemaufruf
getcwd() bereit, den die
in dieser Seite beschriebenen Funktionen falls möglich benutzen. Der
Systemaufruf akzeptiert die gleichen Argumente wie die Bibliotheksfunktion des
gleichen Namens, aber sie ist darauf begrenzt, maximal
PATH_MAX Byte
zurückzuliefern. (Vor Linux 3.12 war die Begrenzung der
Größe des zurückgelieferten Pfadnamens die
Systemseitengröße. Auf vielen Architekturen sind sowohl
PATH_MAX als auch die Systemseitengröße beide 4096 Byte,
aber einige Architekturen haben eine größere
Seitengröße.) Falls die Länge des Pfadnamens des
aktuellen Arbeitsverzeichnisses dies Begrenzung überschreitet, dann
schlägt der Systemaufruf mit dem Fehler
ENAMETOOLONG fehl. In
diesem Fall fällt die Bibliotheksfunktion auf eine (langsamere)
alternative Implementierung zurück, die den kompletten Pfadnamen
zurückliefert.
Folgend einer Änderung in Linux 2.6.36 wird dem durch den Systemaufruf
getcwd() zurückgelieferten Pfadnamen die Zeichenkette
»(unreachable)« vorangestellt, falls das aktuelle Verzeichnis
nicht unterhalb des Wurzelverzeichnisses des aktuellen Prozesses ist (z.B. da
der Prozess auf eine neue Dateisystemwurzel mittels
chroot(2) gesetzt
wurde, ohne sein aktuelles Verzeichnis in die neue Wurzel zu wechseln). Dieses
Verhalten kann auch durch einen nichtprivilegierten Benutzer hervorgerufen
werden, der das aktuelle Verzeichnis in einen anderen
Einhängenamensraum gewechselt hat. Beim Umgang mit Pfadnamen von
nichtvertrauenswürdigen Quellen sollten Aufrufende von in dieser Seite
beschriebenen Funktionen in Betracht ziehen, zu überprüfen, ob
der zurückgelieferte Pfadname mit »/« oder mit
»(« anfängt, um zu vermeiden, dass ein nicht erreichbarer
Pfad als relativer Pfadname misinterpretiert wird.
Seit der Änderung in Linux 2.6.36, die »(unreachable)« in
den oben beschriebenen Gegebenheiten hinzufügte, ist Glibcs
Implementierung von
getcwd() nicht mehr mit POSIX konform und liefert
einen relativen Pfadnamen zurück, wenn der API-Vertrag einen absoluten
Pfadnamen verlangt. Ab Glibc 2.27 ist dies korrigiert: ein Aufruf von
getcwd() von solch einem Pfadnamen liefert jetzt einen Fehlschlag mit
ENOENT.
pwd(1),
chdir(2),
fchdir(2),
open(2),
unlink(2),
free(3),
malloc(3)
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Schulze
<
[email protected]>, Chris Leick <
[email protected]>, Mario
Blättermann <
[email protected]> und Helge Kreutzmann
<
[email protected]> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer