NAZWA
getcwd, getwd, get_current_dir_name - odczytanie bieżącego katalogu roboczego
SKŁADNIA
#include <unistd.h>
char *getcwd(char *buf, size_t size);
char *getwd(char *buf);
char *get_current_dir_name(void);
Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):
get_current_dir_name():
_GNU_SOURCE
getwd():
Od glibc 2.12:
(_XOPEN_SOURCE >= 500)
&& ! (_POSIX_C_SOURCE >= 200809L)
|| /* Od glibc 2.19: */ _DEFAULT_SOURCE
|| /* Wersje glibc <= 2.19: */ _BSD_SOURCE
Przed glibc 2.12: _BSD_SOURCE || _XOPEN_SOURCE >= 500
OPIS
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.
WARTOŚĆ ZWRACANA
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.
BŁĘDY
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. |
ATRYBUTY
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
ZGODNE Z
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.
UWAGI
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.
Różnice
biblioteki C/jądra
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.
BŁĘDY
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.
ZOBACZ TAKŻE
pwd(1), chdir(2), fchdir(2), open(2), unlink(2), free(3), malloc(3)
O STRONIE
Angielska wersja tej strony pochodzi z wydania 5.07 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.
TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Andrzej Krzysztofowicz <ankry [AT] green.pl> i Robert Luberda <robert [AT] debian.org>
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 <manpages-pl-list [AT] lists.net>.