getcwd, getwd, get_current_dir_name - odczytanie bieżącego
katalogu roboczego
Standardowa biblioteka C (
libc,
-lc)
#include <unistd.h>
char *getcwd(char buf[.size], size_t size);
char *get_current_dir_name(void);
[[deprecated]] char *getwd(char buf[PATH_MAX]);
get_current_dir_name():
_GNU_SOURCE
getwd():
Od glibc 2.12:
(_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200809L)
|| /* glibc >= 2.19: */ _DEFAULT_SOURCE
|| /* glibc <= 2.19: */ _BSD_SOURCE
Przed glibc 2.12:
_BSD_SOURCE || _XOPEN_SOURCE >= 500
Te funkcje zwracają zakończony bajtem null łańcuch
znaków zawierający nazwę bezwzględnej
ścieżki do bieżącego katalogu roboczego procesu
wywołującego. Nazwa ścieżki jest zwracana jako
wynik funkcji i poprzez argument
buf, jeśli jest obecny.
Funkcja
getcwd() kopiuje nazwę bezwzględnej
ścieżki dostępu bieżącego katalogu
roboczego do tablicy wskazywanej przez
buf, która to tablica ma
długość
size.
Jeśli nazwa bieżącej bezwzględnej
ścieżki dostępu wymaga bufora dłuższego
niż
size elementów, to zwracane jest
NULL, a
errno jest ustawiane na
ERANGE; aplikacja powinna
sprawdzać, czy nie wystąpił ten błąd, i
przydzielać większy bufor, jeżeli jest to potrzebne.
Jako rozszerzenie standardu POSIX.1-2001, wersja glibc funkcji
getcwd()
przydziela bufor dynamicznie korzystając z
malloc(3),
jeśli
buf jest równe
NULL. W tym przypadku
przydzielony bufor ma długość
size, chyba
że
size jest równe zero, co oznacza że buforowi
buf jest przydzielane tyle pamięci, ile potrzeba. Program
wywołujący powinien zwolnić zwrócony bufor,
wywołując
free(3).
get_current_dir_name() przydzieli za pomocą
malloc(3)
tablicę dostatecznie dużą, aby przechować
bezwzględną nazwę bieżącego katalogu.
Jeśli zmienna środowiskowa
PWD jest ustawiona, a jej
wartość prawidłowa, to zostanie zwrócona ta
wartość. Program wywołujący powinien
zwolnić zwrócony bufor, wywołując
free(3).
getwd() nie przydziela żadnej pamięci za pomocą
malloc(3). Argument
buf powinien być wskaźnikiem
do tablicy o długości co najmniej
PATH_MAX bajtów.
Jeśli długość bezwzględnej
ścieżki do bieżącego katalogu roboczego
łącznie z końcowym bajtem null przekracza
PATH_MAX
bajtów, to zwracany jest NULL i
errno jest ustawiane na
ENAMETOOLONG. (Należy zwrócić uwagę,
że
PATH_MAX nie musi być stałą
określaną podczas kompilacji; co więcej może ona
zależeć od systemu plików, patrz
pathconf(3)). Ze
względu na przenośność i bezpieczeństwo
używanie
getwd() nie jest zalecane.
On success, these functions return a pointer to a string containing the pathname
of the current working directory. In the case of
getcwd() and
getwd() this is the same value as
buf.
W przypadku błędu funkcje te zwracają NULL,
jednocześnie ustawiając
errno, wskazujące na
rodzaj błędu. Zawartość tablicy wskazywanej przez
buf w przypadku błędu jest nieokreślona.
- EACCES
- Brak praw do odczytu lub przeszukiwania składnika
nazwy pliku.
- EFAULT
-
buf wskazuje na niewłaściwy
adres.
- EINVAL
- Argument size jest zerowy, a buf nie jest
wskaźnikiem NULL.
- EINVAL
-
getwd(): buf jest równy NULL.
- ENAMETOOLONG
-
getwd(): Rozmiar zakończonej znakiem null
pełnej nazwy katalogu roboczego przekracza PATH_MAX
bajtów.
- ENOENT
- Bieżący katalog roboczy został
skasowany.
- ENOMEM
- Brak pamięci.
- ERANGE
- Argument size jest mniejszy od
długości pełnej nazwy katalogu roboczego,
włączając w to końcowy bajt null.
Należy przydzielić większą tablicę i
spróbować ponownie.
Informacje o pojęciach używanych w tym rozdziale można
znaleźć w podręczniku
attributes(7).
Interfejs |
Atrybut |
Wartość |
getcwd(), getwd() |
Bezpieczeństwo wątkowe |
MT-Safe |
get_current_dir_name() |
Bezpieczeństwo wątkowe |
MT-Safe env |
getcwd() jest zgodna z POSIX.1-2001. Należy jednak
zauważyć, że POSIX.1-2001 nie określa zachowania
funkcji
getcwd(), jeśli
buf jest równy NULL.
getwd() jest oznaczona jako przestarzała w POSIX.1-2001.
POSIX.1-2008 usuwa definicję
getwd(). Zamiast niej należy
używać
getcwd(). POSIX.1-2001 nie określa
żadnych błędów dla
getwd().
get_current_dir_name() jest rozszerzeniem GNU.
Pod Linuksem funkcje te używają wywołania systemowego
getcwd() (dostępnego od wersji 2.1.92 Linuksa). W starszych
systemach mogły odpytywać
/proc/self/cwd. Gdy nie ma ani
funkcji systemowej, ani systemu plików proc, wywoływana jest
implementacja ogólna. Jedynie w takiej sytuacji wywołanie tych
funkcji może pod Linuksem zwrócić w razie
niepomyślnego zakończenia błąd
EACCES.
Funkcje te są często używane do zapamiętywania
położenia bieżącego katalogu roboczego w celu
późniejszego powrotu do niego. Gdy dostępnych jest
dostatecznie wiele deskryptorów plików, otwarcie
bieżącego katalogu (".") i wywołanie
fchdir(2), aby do niego wrócić, jest zazwyczaj
szybszą i bardziej niezawodną alternatywą,
zwłaszcza na platformach innych niż Linux.
Jądro Linuksa dostarcza wywołania systemowego
getcwd,
które jeśli jest to możliwe, będzie używane
przez funkcje opisane w tym podręczniku. Wywołanie to przyjmuje
takie same argumenty, jak funkcja biblioteczna o tej samej nazwie, ale
długość zwracanej wartości jest ograniczona do
PATH_MAX bajtów. (Przed wersją 3.12 Linuksa,
ograniczeniem długości zwracane wartości był
rozmiar strony systemowej. W przypadku wielu architektur sprzętowych
PATH_MAX i rozmiar strony są sobie równe i wynoszą
4096, ale jest kilka architektur, które mają większy
rozmiar strony). Jeśli długość
ścieżki bieżącego katalogu roboczego przekracza
ten limit, to wywołanie systemowe zwraca błąd
ENAMETOOLONG. W takim przypadku funkcje biblioteczne przechodzą
do alternatywnej (wolniejszej) implementacji zwracającej
pełną nazwę ścieżki.
Jeśli bieżący katalog roboczy nie znajduje się
poniżej głównego katalogu bieżącego procesu
(na przykład ponieważ ustawił nowy katalog
główny systemu plików za pomocą
chroot(2),
ale nie zmienił swojego katalogu bieżącego na ten nowy
katalog główny), to od Linuksa 2.6.36 zwrócona
ścieżka zostanie poprzedzona napisem "(unreachable)".
Takie zachowanie może być także spowodowane przez
użytkownika nieuprzywilejowanego zmieniającego
bieżący katalog do innej przestrzeni nazw montowania. Podczas
pracy z ścieżkami pochodzącymi z niezaufanych
źródeł programy wywołujące te funkcje
powinny rozważyć sprawdzanie, czy zwrócona
ścieżka zaczyna się od znaku "/", czy od znaku
"(", aby uniknąć interpretowania niedostępnych
ścieżek jako ścieżek względnych.
Poacząwszy od tej zmiany w Linuksie 2.6.36, która w przypadkach
powyżej opisanych dodawała prefiks "(unreachable)",
implementacja glibc funkcji
getcwd() stała się niezgodna
ze standardem POSIX i zwracała względną
ścieżkę, mimo że API wymagało
ścieżki bezwzględnej. Zostało to naprawione w
glibc 2.27: wywołanie
getcwd() z takiego katalogu
bieżącego zwróci błąd
ENONET.
pwd(1),
chdir(2),
fchdir(2),
open(2),
unlink(2),
free(3),
malloc(3)
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Andrzej Krzysztofowicz <
[email protected]> i Robert
Luberda <
[email protected]>
Niniejsze tłumaczenie jest wolną dokumentacją.
Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z
GNU
General Public License w wersji 3 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy
zgłaszać na adres listy dyskusyjnej
[email protected]