Provided by: manpages-pl-dev_4.26.0-1_all 

NAZWA
link, linkat - tworzy kolejną nazwę pliku
BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)
SKŁADNIA
#include <unistd.h>
int link(const char *oldpath, const char *newpath);
#include <fcntl.h> /* Definicja stałych AT_* */
#include <unistd.h>
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 dowiązanie (nazywane też dowiązaniem zwykłym albo twardym) do istniejącego pliku.
Jeśli plik newpath już istnieje, to nie będzie nadpisany.
Ta nowa nazwa może być używana dokładnie tak samo jak stara, w dowolnych operacjach; obie nazwy odnoszą
się do tego samego pliku (i w związku z tym mają te same uprawnienia i własność). Nie można też
powiedzieć, która nazwa jest „oryginalna”.
linkat()
Wywołanie systemowe linkat() operuje w dokładnie taki sam sposób jak link(), z wyjątkiem różnic opisanych
tutaj.
Jeśli ścieżka podana w oldpath jest względna, jest ona interpretowana względem katalogu, do którego
odnosi się deskryptor pliku olddirfd (zamiast względem bieżącego katalogu roboczego procesu wywołującego,
jak ma to miejsce w link() w przypadku ścieżek względnych).
Jeśli oldpath jest względna, a olddirfd ma wartość specjalną AT_FDCWD, to oldpath jest interpretowana
względem bieżącego katalogu roboczego procesu wywołującego (czyli tak jak robi to link()).
Jeśli oldpath jest bezwzględna, to olddirfd jest ignorowane.
Interpretacja newpath jest taka sama jak oldpath, z tym wyjątkiem, że ścieżka względna jest
interpretowana względem katalogu, do którego odnosi się deskryptor pliku newdirfd.
Następujące wartości mogą być zsumowane bitowo (OR) we flags:
AT_EMPTY_PATH (od Linuksa 2.6.39)
Jeśli oldpath jest pustym łańcuchem, tworzy dowiązanie do pliku, do którego odnosi się olddirfd
(który mógł być pozyskany za pomocą znacznika O_PATH open(2)). W takim przypadku olddirfd może
odnosić się do dowolnego typu pliku, z wyjątkiem katalogu. Zwykle nie zadziała to, gdy licznik
dowiązań wskazuje zero (pliki utworzone z O_TMPFILE i bez O_EXCL są wyjątkiem). Wywołujący musi
mieć przywilej CAP_DAC_READ_SEARCH (ang. capability), aby użyć tego znacznika. Niniejszy znacznik
jest typowo linuksowy; należy zdefiniować _GNU_SOURCE, aby pozyskać jego definicję.
AT_SYMLINK_FOLLOW (od Linuksa 2.6.18)
Domyślnie, linkat(), nie rozwija oldpath, jeśli jest ona dowiązaniem symbolicznym (jak link()).
Można podać znacznik AT_SYMLINK_FOLLOW we flags, aby oldpath została rozwiązana, jeśli jest
dowiązaniem symbolicznym. Jeśli zamontowano procfs, może posłużyć to za alternatywę do
AT_EMPTY_PATH, podobnie do:
linkat(AT_FDCWD, "/proc/self/fd/<fd>", newdirfd,
newname, AT_SYMLINK_FOLLOW);
Przed Linuksem 2.6.18, argument flags nie był używany; wymagane było podanie jego wartości równej 0.
Więcej informacji o potrzebie wprowadzenia linkat() można znaleźć w podręczniku openat(2).
WARTOŚĆ ZWRACANA
Po pomyślnym zakończeniu zwracane jest zero. Po błędzie zwracane jest -1 i ustawiane errno, wskazując
błąd.
BŁĘDY
EACCES Odmówiono zapisu do katalogu zawierającego newpath lub brak uprawnienia przeszukiwania dla jednego
z katalogów w składowej ścieżek oldpath lub newpath (zob. też path_resolution(7)).
EDQUOT Przydział bloków dyskowych użytkownika dotyczący systemu plików został wyczerpany.
EEXIST newpath już istnieje.
EFAULT oldpath lub newpath wskazuje poza dostępną dla użytkownika przestrzeń adresową.
EIO Wystąpił błąd wejścia/wyjścia.
ELOOP Podczas rozwiązywania oldpath lub newpath napotkano zbyt wiele dowiązań symbolicznych.
EMLINK Plik do którego odnosi się oldpath, osiągnął już maksymalną liczbę prowadzących do niego dowiązań
zwykłych. Przykładowo, w systemie plików ext4(5) bez cechy dir_index, limit liczby dowiązań
zwykłych wynosi 65 000; na btrfs(5) jest to 65 535 dowiązań.
ENAMETOOLONG
oldpath lub newpath było zbyt długie.
ENOENT Składnik katalogu w oldpath lub newpath nie istnieje, lub jest wiszącym dowiązaniem symbolicznym.
ENOMEM Brak pamięci jądra.
ENOSPC Na urządzeniu, zawierającym plik nie ma miejsca na kolejny wpis w katalogu.
ENOTDIR
Składnik oldpath lub newpath używany jako katalog nie jest w rzeczywistości katalogiem.
EPERM oldpath jest katalogiem.
EPERM System plików zawierający oldpath i newpath nie obsługuje tworzenia twardych dowiązań.
EPERM (od Linuksa 3.6)
Wywołujący nie ma uprawnienia do utworzenia dowiązania zwykłego do tego pliku (zob. opis
/proc/sys/fs/protected_hardlinks w proc(5)).
EPERM oldpath została oznaczona jako tylko do odczytu (immutable) lub tylko do nadpisu (append-only; zob
FS_IOC_SETFLAGS(2const)).
EROFS Plik leży na systemie plików tylko dla odczytu.
EXDEV oldpath i newpath nie są zamontowane w tym samym systemie plików (Linux dopuszcza montowanie
systemu plików w wielu punktach, ale link() nie działa poprzez różne montowania, nawet gdy w obu
miejscach zamontowano ten sam system plików).
Mogą wystąpić następujące dodatkowe błędy dla linkat():
EBADF oldpath (newpath) są względne, lecz olddirfd (newdirfd) nie wynosi ani AT_FDCWD, ani nie jest
prawidłowym deskryptorem pliku.
EINVAL We flags podano nieprawidłową wartość znacznika.
ENOENT We flags podano AT_EMPTY_PATH, lecz wywołujący nie posiada przywileju CAP_DAC_READ_SEARCH (ang.
capability).
ENOENT Próbowano utworzyć dowiązanie do pliku /proc/self/fd/NN, odnoszącego się do deskryptora liku
utworzonego za pomocą
open(path, O_TMPFILE | O_EXCL, mode);
Zobacz open(2).
ENOENT Próbowano utworzyć dowiązanie do pliku /proc/self/fd/NN, odnoszącego się do pliku, który usunięto.
ENOENT oldpath jest ścieżką względną, a olddirfd odnosi się do usuniętego katalogu albo newpath jest
ścieżką względną, a newdirfd odnosi się do usuniętego katalogu.
ENOTDIR
oldpath jest względna, a olddirfd jest deskryptorem pliku odnoszącym się do pliku innego niż
katalog; lub analogicznie dla newpath i newdirfd
EPERM We flags podano AT_EMPTY_PATH, oldpath jest łańcuchem pustym, a olddirfd odnosi się do katalogu.
WERSJE
POSIX.1-2001 twierdzi, że link() powinien rozwiązywać oldpath, jeśli jest ona dowiązaniem symbolicznym.
Jednak od Linuksa 2.0, Linux tak nie czyni: jeśli oldpath jest dowiązaniem symbolicznym, to newpath jest
tworzona jako dowiązanie zwykłe (twarde) do samego pliku dowiązania symbolicznego (tj. newpath staje się
dowiązaniem symbolicznym do tego samego pliku, do którego odnosi się oldpath). Niektóre inne
implementacje zachowują się w ten sam sposób co Linux. POSIX.1-2008 zmieniło specyfikację link(), czyniąc
rozwiązywanie oldpath gdy jest to dowiązanie symboliczne, zależnym od implementacji. Aby uzyskać
precyzyjną kontrolę nad traktowaniem dowiązań symbolicznych przy tworzeniu dowiązań zwykłych, należy
korzystać z linkat().
glibc
W starszych jądrach, gdy niedostępne jest linkat() funkcja opakowująca z biblioteki glibc z konieczności
korzysta z link(), chyba że podano AT_SYMLINK_FOLLOW. Gdy oldpath i newpath są ścieżkami względnymi,
glibc tworzy ścieżki w zależności od dowiązań symbolicznych w /proc/self/fd, które odnoszą się do
argumentów 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
Dowiązania zwykłe (twarde), tworzone z pomocą link(), nie mogą wykraczać poza jeden system plików. W
takich sytuacjach można użyć funkcji symlink(2).
USTERKI
Na systemach NFS, wartość zwracana może być nieprawidłowa w wypadku gdy serwer NFS dokonuje tworzenia
dowiązania i umiera przed zakomunikowaniem tego faktu. Można użyć stat(2) aby dowiedzieć się, czy
dowiązanie zostało utworzone.
ZOBACZ TAKŻE
ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2), path_resolution(7), symlink(7)
TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>
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 manpages-pl-
list@lists.sourceforge.net.
Linux man-pages 6.9.1 13 czerwca 2024 r. link(2)