link(2) | System Calls Manual | link(2) |
link, linkat - создаёт новое имя файла
Standard C library (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);
linkat():
Начиная с glibc 2.10: _POSIX_C_SOURCE >= 200809L До glibc 2.10: _ATFILE_SOURCE
link() создаёт новую ссылку (также называемую жёсткую ссылку) на существующий файл.
Если newpath существует, то он не будет перезаписан.
Это новое имя может использоваться как и старое для любых операций; оба имени ссылаются на один файл (и имеют одинаковые права и владельцев) и невозможно сказать какое имя считать "изначальным".
Системный вызов linkat() работает также как системный вызов link(), за исключением случаев, описанных здесь.
Если в oldpath задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор olddirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в link()).
Если в oldpath задан относительный путь и olddirfd равно специальному значению AT_FDCWD, то oldpath рассматривается относительно текущего рабочего каталога вызывающего процесса (как link()).
Если в oldpath указан абсолютный путь, то olddirfd игнорируется.
Значение newpath интерпретируется как oldpath, за исключением того, что относительный путь интерпретируется относительно каталога, на который ссылается файловый дескриптор newdirfd.
Следующие значения можно побитово (OR) объединять в flags:
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().
On success, zero is returned. On error, -1 is returned, and errno is set to indicate the error.
В linkat() дополнительно могут возникнуть следующие ошибки:
open(path, O_TMPFILE | O_EXCL, mode);
linkat() was added in Linux 2.6.16; library support was added in glibc 2.4.
link(): SVr4, 4.3BSD, POSIX.1-2001 (но смотрите ЗАМЕЧАНИЯ), POSIX.1-2008.
linkat(): POSIX.1-2008.
Жёсткие ссылки, создаваемые link(), не могут располагаться в разных файловых системах. Если это необходимо, используйте symlink(2).
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().
В старых ядрах, где linkat() отсутствует (и если не указан флаг AT_SYMLINK_NOFOLLOW), обёрточная функция glibc использует link(). Если oldpath и newpath являются относительными путями, то glibc собирает пути относительно символической ссылки в /proc/self/fd, которая соответствует аргументам olddirfd и newdirfd.
В файловых системах 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>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
5 февраля 2023 г. | Linux man-pages 6.03 |