link(2) System Calls Manual link(2) NAZWA link, linkat - tworzy kolejna nazwe pliku BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int link(const char *oldpath, const char *newpath); #include /* Definicja stalych AT_* */ #include int linkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): linkat(): Od glibc 2.10: _POSIX_C_SOURCE >= 200809L Przed glibc 2.10: _ATFILE_SOURCE OPIS link() tworzy nowe dowiazanie (nazywane tez dowiazaniem zwyklym albo twardym) do istniejacego pliku. Jesli plik newpath juz istnieje, to nie bedzie nadpisany. Ta nowa nazwa moze byc uzywana dokladnie tak samo jak stara, w dowolnych operacjach; obie nazwy odnosza sie do tego samego pliku (i w zwiazku z tym maja te same uprawnienia i wlasnosc). Nie mozna tez powiedziec, ktora nazwa jest ,,oryginalna". linkat() Wywolanie systemowe linkat() operuje w dokladnie taki sam sposob jak link(), z wyjatkiem roznic opisanych tutaj. Jesli sciezka podana w oldpath jest wzgledna, jest ona interpretowana wzgledem katalogu, do ktorego odnosi sie deskryptor pliku olddirfd (zamiast wzgledem biezacego katalogu roboczego procesu wywolujacego, jak ma to miejsce w link() w przypadku sciezek wzglednych). Jesli oldpath jest wzgledna, a olddirfd ma wartosc specjalna AT_FDCWD, to oldpath jest interpretowana wzgledem biezacego katalogu roboczego procesu wywolujacego (czyli tak jak robi to link()). Jesli oldpath jest bezwzgledna, to olddirfd jest ignorowane. Interpretacja newpath jest taka sama jak oldpath, z tym wyjatkiem, ze sciezka wzgledna jest interpretowana wzgledem katalogu, do ktorego odnosi sie deskryptor pliku newdirfd. Nastepujace wartosci moga byc zsumowane bitowo (OR) we flags: AT_EMPTY_PATH (od Linuksa 2.6.39) Jesli oldpath jest pustym lancuchem, tworzy dowiazanie do pliku, do ktorego odnosi sie olddirfd (ktory mogl byc pozyskany za pomoca znacznika O_PATH open(2)). W takim przypadku olddirfd moze odnosic sie do dowolnego typu pliku, z wyjatkiem katalogu. Zwykle nie zadziala to, gdy licznik dowiazan wskazuje zero (pliki utworzone z O_TMPFILE i bez O_EXCL sa wyjatkiem). Wywolujacy musi miec przywilej CAP_DAC_READ_SEARCH (ang. capability), aby uzyc tego znacznika. Niniejszy znacznik jest typowo linuksowy; nalezy zdefiniowac _GNU_SOURCE, aby pozyskac jego definicje. AT_SYMLINK_FOLLOW (od Linuksa 2.6.18) Domyslnie, linkat(), nie rozwija oldpath, jesli jest ona dowiazaniem symbolicznym (jak link()). Mozna podac znacznik AT_SYMLINK_FOLLOW we flags, aby oldpath zostala rozwiazana, jesli jest dowiazaniem symbolicznym. Jesli zamontowano procfs, moze posluzyc to za alternatywe do AT_EMPTY_PATH, podobnie do: linkat(AT_FDCWD, "/proc/self/fd/", newdirfd, newname, AT_SYMLINK_FOLLOW); Przed Linuksem 2.6.18, argument flags nie byl uzywany; wymagane bylo podanie jego wartosci rownej 0. Wiecej informacji o potrzebie wprowadzenia linkat() mozna znalezc w podreczniku openat(2). WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracane jest zero. Po bledzie zwracane jest -1 i ustawiane errno, wskazujac blad. BLEDY EACCES Odmowiono zapisu do katalogu zawierajacego newpath lub brak uprawnienia przeszukiwania dla jednego z katalogow w skladowej sciezek oldpath lub newpath (zob. tez path_resolution(7)). EDQUOT Przydzial blokow dyskowych uzytkownika dotyczacy systemu plikow zostal wyczerpany. EEXIST newpath juz istnieje. EFAULT oldpath lub newpath wskazuje poza dostepna dla uzytkownika przestrzen adresowa. EIO Wystapil blad wejscia/wyjscia. ELOOP Podczas rozwiazywania oldpath lub newpath napotkano zbyt wiele dowiazan symbolicznych. EMLINK Plik do ktorego odnosi sie oldpath, osiagnal juz maksymalna liczbe prowadzacych do niego dowiazan zwyklych. Przykladowo, w systemie plikow ext4(5) bez cechy dir_index, limit liczby dowiazan zwyklych wynosi 65 000; na btrfs(5) jest to 65 535 dowiazan. ENAMETOOLONG oldpath lub newpath bylo zbyt dlugie. ENOENT Skladnik katalogu w oldpath lub newpath nie istnieje, lub jest wiszacym dowiazaniem symbolicznym. ENOMEM Brak pamieci jadra. ENOSPC Na urzadzeniu, zawierajacym plik nie ma miejsca na kolejny wpis w katalogu. ENOTDIR Skladnik oldpath lub newpath uzywany jako katalog nie jest w rzeczywistosci katalogiem. EPERM oldpath jest katalogiem. EPERM System plikow zawierajacy oldpath i newpath nie obsluguje tworzenia twardych dowiazan. EPERM (od Linuksa 3.6) Wywolujacy nie ma uprawnienia do utworzenia dowiazania zwyklego do tego pliku (zob. opis /proc/sys/fs/protected_hardlinks w proc(5)). EPERM oldpath is marked immutable or append-only. (See FS_IOC_SETFLAGS(2const).) EROFS Plik lezy na systemie plikow tylko dla odczytu. EXDEV oldpath i newpath nie sa zamontowane w tym samym systemie plikow (Linux dopuszcza montowanie systemu plikow w wielu punktach, ale link() nie dziala poprzez rozne montowania, nawet gdy w obu miejscach zamontowano ten sam system plikow). Moga wystapic nastepujace dodatkowe bledy dla linkat(): EBADF oldpath (newpath) sa wzgledne, lecz olddirfd (newdirfd) nie wynosi ani AT_FDCWD, ani nie jest prawidlowym deskryptorem pliku. EINVAL We flags podano nieprawidlowa wartosc znacznika. ENOENT We flags podano AT_EMPTY_PATH, lecz wywolujacy nie posiada przywileju CAP_DAC_READ_SEARCH (ang. capability). ENOENT Probowano utworzyc dowiazanie do pliku /proc/self/fd/NN, odnoszacego sie do deskryptora liku utworzonego za pomoca open(path, O_TMPFILE | O_EXCL, mode); Zobacz open(2). ENOENT Probowano utworzyc dowiazanie do pliku /proc/self/fd/NN, odnoszacego sie do pliku, ktory usunieto. ENOENT oldpath jest sciezka wzgledna, a olddirfd odnosi sie do usunietego katalogu albo newpath jest sciezka wzgledna, a newdirfd odnosi sie do usunietego katalogu. ENOTDIR oldpath jest wzgledna, a olddirfd jest deskryptorem pliku odnoszacym sie do pliku innego niz katalog; lub analogicznie dla newpath i newdirfd EPERM We flags podano AT_EMPTY_PATH, oldpath jest lancuchem pustym, a olddirfd odnosi sie do katalogu. WERSJE POSIX.1-2001 twierdzi, ze link() powinien rozwiazywac oldpath, jesli jest ona dowiazaniem symbolicznym. Jednak od Linuksa 2.0, Linux tak nie czyni: jesli oldpath jest dowiazaniem symbolicznym, to newpath jest tworzona jako dowiazanie zwykle (twarde) do samego pliku dowiazania symbolicznego (tj. newpath staje sie dowiazaniem symbolicznym do tego samego pliku, do ktorego odnosi sie oldpath). Niektore inne implementacje zachowuja sie w ten sam sposob co Linux. POSIX.1-2008 zmienilo specyfikacje link(), czyniac rozwiazywanie oldpath gdy jest to dowiazanie symboliczne, zaleznym od implementacji. Aby uzyskac precyzyjna kontrole nad traktowaniem dowiazan symbolicznych przy tworzeniu dowiazan zwyklych, nalezy korzystac z linkat(). glibc W starszych jadrach, gdy niedostepne jest linkat() funkcja opakowujaca z biblioteki glibc z koniecznosci korzysta z link(), chyba ze podano AT_SYMLINK_FOLLOW. Gdy oldpath i newpath sa sciezkami wzglednymi, glibc tworzy sciezki w zaleznosci od dowiazan symbolicznych w /proc/self/fd, ktore odnosza sie do argumentow olddirfd i newdirfd. STANDARDY link() POSIX.1-2008. HISTORIA link() SVr4, 4.3BSD, POSIX.1-2001 (lecz zob. WERSJE). linkat() POSIX.1-2008. Linux 2.6.16, glibc 2.4. UWAGI Dowiazania zwykle (twarde), tworzone z pomoca link(), nie moga wykraczac poza jeden system plikow. W takich sytuacjach mozna uzyc funkcji symlink(2). USTERKI Na systemach NFS, wartosc zwracana moze byc nieprawidlowa w wypadku gdy serwer NFS dokonuje tworzenia dowiazania i umiera przed zakomunikowaniem tego faktu. Mozna uzyc stat(2) aby dowiedziec sie, czy dowiazanie zostalo utworzone. ZOBACZ TAKZE ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2), path_resolution(7), symlink(7) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.9.1 13 czerwca 2024 r. link(2)