Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

       link, linkat - создаёт новое имя файла

БИБЛИОТЕКА

       Стандартная библиотека языка C (libc, -lc)

ОБЗОР

       #include <unistd.h>

       int link(const char *oldpath, const char *newpath);

       #include <fcntl.h>           /* определения констант AT_* */
       #include <unistd.h>

       int linkat(int olddirfd, const char *oldpath,
                  int newdirfd, const char *newpath, int flags);

   Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

       linkat():
           Начиная с glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           До glibc 2.10:
               _ATFILE_SOURCE

ОПИСАНИЕ

       link() создаёт новую ссылку (также называемую жёсткую ссылку) на существующий файл.

       Если newpath существует, то он не будет перезаписан.

       Это  новое  имя может использоваться как и старое для любых операций; оба имени ссылаются на один файл (и
       имеют одинаковые права и владельцев) и невозможно сказать какое имя считать "изначальным".

   linkat()
       Системный вызов linkat() работает также как системный вызов link(),  за  исключением  случаев,  описанных
       здесь.

       Если  в  oldpath  задан  относительный  путь, то он считается относительно каталога, на который ссылается
       файловый дескриптор olddirfd (а не относительно текущего рабочего каталога вызывающего процесса, как  это
       делается в link()).

       Если  в  oldpath  задан  относительный  путь  и olddirfd равно специальному значению AT_FDCWD, то oldpath
       рассматривается относительно текущего рабочего каталога вызывающего процесса (как link()).

       Если в oldpath указан абсолютный путь, то olddirfd игнорируется.

       Значение  newpath  интерпретируется  как  oldpath,  за   исключением   того,   что   относительный   путь
       интерпретируется относительно каталога, на который ссылается файловый дескриптор newdirfd.

       Следующие значения можно побитово (OR) объединять в flags:

       AT_EMPTY_PATH (начиная с Linux 2.6.39)
              Если  значение  oldpath  равно  пустой  строке,  то создаётся ссылка на файл, на который указывает
              olddirfd (который может быть получен с помощью open(2) с флагом O_PATH). В  этом  случае  olddirfd
              может  указывать  на  файл  любого  типа кроме каталога. Это, обычно, не работает, если файл имеет
              счётчик ссылок равный нулю (исключение — файлы,  созданные  с  флагом  O_TMPFILE  и  без  O_EXCL).
              Вызывающий должен иметь мандат CAP_DAC_READ_SEARCH, чтобы использовать этот флаг. Данный флаг есть
              только в Linux; для получения его определения определите _GNU_SOURCE.

       AT_SYMLINK_FOLLOW (начиная с Linux 2.6.18)
              По  умолчанию,  linkat() не разыменовывает oldpath, если это символьная ссылка (подобно link()). В
              flags можно указать флаг AT_SYMLINK_FOLLOW, и тогда значение oldpath будет разыменовано, если  это
              символьная  ссылка.  Если  смонтирована  procfs,  то  это может быть использовано как альтернатива
              AT_EMPTY_PATH, например:

                  linkat(AT_FDCWD, "/proc/self/fd/<fd>", newdirfd,
                         newname, AT_SYMLINK_FOLLOW);

       Before Linux 2.6.18, the flags argument was unused, and had to be specified as 0.

       Смотрите в openat(2) объяснение необходимости linkat().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При успешном выполнении возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.

ОШИБКИ

       EACCES Нет прав на запись в каталог, содержащий newpath, или в одном из каталогов  пути  до  oldpath  или
              newpath не разрешён поиск (см. также path_resolution(7)).

       EDQUOT Исчерпана пользовательская квота на дисковые блоки файловой системы.

       EEXIST newpath уже существует.

       EFAULT Значения oldpath и newpath указывают за пределы доступного адресного пространства.

       EIO    Произошла ошибка ввода-вывода.

       ELOOP  Во время определения oldpath или newpath встретилось слишком много символьных ссылок.

       EMLINK На  файл,  на который указывает oldpath, уже создано максимальное количество ссылок. Например, для
              файловой системы ext4(5), в которой не используется свойство dir_index, ограничение по  количеству
              жёстких ссылок на файл равно 65000; в btrfs(5) — 65535 ссылок.

       ENAMETOOLONG
              Слишком длинное значение аргумента oldpath или newpath.

       ENOENT Компонент каталога в oldpath или newpath не существует или является повисшей ссылкой.

       ENOMEM Недостаточное количество памяти ядра.

       ENOSPC На устройстве, содержащем файл, нет места для создания нового элемента каталога.

       ENOTDIR
              Компонент, используемый как каталог в oldpath или newpath, на самом деле не является каталогом.

       EPERM  oldpath является каталогом.

       EPERM  Файловая система, содержащая oldpath и newpath, не поддерживает создание жёстких ссылок.

       EPERM (начиная с Linux 3.6)
              Вызывающий   не   имеет  прав  для  создания  жёстких  ссылок  на  этот  файл  (смотрите  описание
              /proc/sys/fs/protected_hardlinks в proc(5)).

       EPERM  oldpath is marked immutable or append-only.  (See FS_IOC_SETFLAGS(2const).)

       EROFS  Файл расположен в файловой системе, доступной только для чтения.

       EXDEV  oldpath  и  newpath  находятся  не  в  одной  смонтированной  файловой  системе  (Linux  позволяет
              монтировать  файловую  систему  в  несколько  точек,  но  link() не работает с отличающими точками
              монтирования, даже если в них смонтирована идентичная файловая система).

       В linkat() дополнительно могут возникнуть следующие ошибки:

       EBADF  oldpath (newpath)  is relative but olddirfd (newdirfd)  is  neither  AT_FDCWD  nor  a  valid  file
              descriptor.

       EINVAL В flags указано неверное значение флага.

       ENOENT Флаг AT_EMPTY_PATH указан в flags, но вызывающий не имеет мандата CAP_DAC_READ_SEARCH.

       ENOENT Предпринята  попытка  сделать  ссылку  на  файл  /proc/self/fd/NN, который соответствует файловому
              дескриптору, созданному с помощью

                  open(path, O_TMPFILE | O_EXCL, mode);

              Смотрите open(2).

       ENOENT An attempt was made to link to a /proc/self/fd/NN file corresponding  to  a  file  that  has  been
              deleted.

       ENOENT Значение oldpath является относительным путём и olddirfd ссылается на каталог, который был удалён,
              или newpath является относительным путём и newdirfd ссылается на каталог, который был удалён.

       ENOTDIR
              Значение  oldpath содержит относительный путь и olddirfd содержит файловый дескриптор, указывающий
              на файл, а не на каталог; или произошло тоже самое с newpath и newdirfd.

       EPERM  Значение AT_EMPTY_PATH было указано в flags, значение  oldpath  равно  пустой  строке  и  olddirfd
              указывает на каталог.

ВЕРСИИ

       POSIX.1-2001 says that link()  should dereference oldpath if it is a symbolic link.  However, since Linux
       2.0, Linux does not do so: if oldpath is a symbolic link, then newpath is created as a (hard) link to the
       same  symbolic link file (i.e., newpath becomes a symbolic link to the same file that oldpath refers to).
       Some other implementations behave in the same manner as Linux.  POSIX.1-2008 changes the specification of
       link(), making it implementation-dependent whether or not oldpath is dereferenced if  it  is  a  symbolic
       link.  For precise control over the treatment of symbolic links when creating a link, use linkat().

   glibc
       В  старых ядрах, где linkat() отсутствует (и если не указан флаг AT_SYMLINK_NOFOLLOW), обёрточная функция
       glibc использует link(). Если oldpath и newpath являются относительными путями, то  glibc  собирает  пути
       относительно символической ссылки в /proc/self/fd, которая соответствует аргументам olddirfd и newdirfd.

СТАНДАРТЫ

       link() POSIX.1-2008.

ИСТОРИЯ

       link() SVr4, 4.3BSD, POSIX.1-2001 (but see VERSIONS).

       linkat()
              POSIX.1-2008.  Linux 2.6.16, glibc 2.4.

ПРИМЕЧАНИЯ

       Жёсткие  ссылки,  создаваемые  link(),  не  могут  располагаться  в  разных  файловых  системах. Если это
       необходимо, используйте symlink(2).

ОШИБКИ

       В файловых системах NFS возвращаемый код может быть  неправильным,  если  сервер  NFS  выполнит  создание
       ссылки  и  завершит  работу  до возврата результата операции. Используйте stat(2), чтобы выяснить была ли
       создана ссылка.

СМОТРИТЕ ТАКЖЕ

       ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2), path_resolution(7), symlink(7)

ПЕРЕВОД

       Русский перевод этой страницы руководства разработал(и) Artyom  Kunyov  <artkun@guitarplayer.ru>,  Azamat
       Hackimov   <azamat.hackimov@gmail.com>,   Dmitry   Bolkhovskikh  <d20052005@yandex.ru>,  Katrin  Kutepova
       <blackkatelv@gmail.com>, Konstantin Shvaykovskiy <kot.shv@gmail.com>, Yuri  Kozlov  <yuray@komyakino.ru>,
       Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                  13 июня 2024 г.                                         link(2)