link()

Создать ссылку на существующий файл

Прототип:

#include <unistd.h>
int link( const char *existing,
const char *new );

Аргументы:

existing
Путь к существующему файлу.
new
Путь для новой ссылки.

Библиотека:

libc

Описание:

Функция link() создает новую запись в директории с именем new для ссылки (то есть, чтобы быть ссылкой) на существующий файл с именем existing. Функция создает новую ссылку для существующего файла и увеличивает счетчик ссылок файла на единицу.


Note: Эта реализация не поддерживает использование link() на директориях или связывание файлов между файловыми системами (разными логическими дисками).

В случае сбоя функции ссылка не создается, и количество ссылок файла остается неизменным.

Если link() завершается успешно, поле st_ctime файла и поля st_ctime и st_mtime директории, содержащую новую запись, помечаются для обновления.

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EACCES
В разрешении на поиск в одном из компонентов пути к файлу отказано, либо ссылка с именем new находится в директории с режимом, который запрещает запись.
EEXIST
Ссылка с именем new уже существует.
ELOOP
Слишком много уровней символических ссылок или префиксов в пути к файлу.
EMLINK
Количество ссылок на файл с именем existing будет превышать LINK_MAX.
ENAMETOOLONG
Длина строки existing или new превышает PATH_MAX, или компонент пути к файлу длиннее, чем NAME_MAX.
ENOENT
Этот код ошибки может означать следующее:
ENOSPC
Директория, которая будет содержать ссылку, не может быть расширена.
ENOSYS
Функция link() не реализована для файловой системы, указанной в existing или new.
ENOTDIR
Компонент одного из путей к файлу не является директорией.
EPERM
Файл с именем existing является директорией.
EROFS
Запрошенная ссылка требует записи в директорию файловой системы, доступной только для чтения.
EXDEV
Ссылка с именем new и файл с именем existing находятся на разных логических дисках.

Примеры:

/*
* The following program performs a rename
* operation of argv[1] to argv[2].
* Please note that this example, unlike the
* library function rename(), ONLY works if
* argv[2] doesn't already exist.
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main( int argc, char** argv )
{
/* Create a link of argv[1] to argv[2]. */
if ( link( argv[1], argv[2] ) == -1 )
{
perror( "link" );
return (EXIT_FAILURE);
}
if ( unlink( argv[1] ) == -1 )
{
perror( argv[1] );
return (EXIT_FAILURE);
}
return (EXIT_SUCCESS);
}

Классификация:

POSIX 1003.1

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

errno, rename(), symlink(), unlink()




Предыдущий раздел: Описание API системной библиотеки