Scroll to navigation

READLINK(2) Руководство программиста Linux READLINK(2)

ИМЯ

readlink - считывает значение символьной ссылки

ОБЗОР

#include <unistd.h>

ssize_t readlink(const char *path, char *buf, size_t bufsiz);


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

readlink():

_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED || _POSIX_C_SOURCE >= 200112L

ОПИСАНИЕ

readlink() помещает содержимое символьной ссылки path в буфер buf размером bufsiz. readlink() не добавляет в buf байт null.Если буфер слишком мал для хранения всего содержимого, то содержимое будет урезано (до длины в bufsiz символов).

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

При успешном выполнении readlink() возвращает количество байт, помещённых в buf. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

В одном из каталогов префикса пути не разрешён поиск (см. также path_resolution(7).
buf выходит за пределы адресного пространства, выделенного процессу.
Аргумент bufsiz содержит отрицательное значение.
Указанный файл не является символьной ссылкой.
При чтении файловой системы произошла ошибка ввода-вывода.
Во время определения pathname встретилось слишком много символьных ссылок.
Слишком длинное значение аргумента pathname или его части.
Указанный файл не существует.
Недостаточное количество памяти ядра.
Компонент в префиксе пути не является каталогом.

СООТВЕТСТВИЕ СТАНДАРТАМ

4.4BSD (вызов readlink() появился в 4.2BSD), POSIX.1-2001.

ЗАМЕЧАНИЯ

В версиях glibc до glibc 2.4 включительно, тип результата readlink() был объявлен как int. В настоящее время типом возвращаемого результата является ssize_t, как (теперь) это требуется по POSIX.1-2001.

Буфера с фиксированным размером может не хватить для хранения содержимого символьной ссылки. Требуемый размер буфера можно получить как значение stat.st_size, возвращаемое на ссылку вызовом lstat(2). Однако, количество байт, записанное readlink(), должно быть проверено, так как требуется убедиться, что размер символьной ссылки не увеличился между вызовами. Динамическое выделение буфера для readlink() также поможет решить проблему с переносимостью, которая возникает, когда для размера буфера используется PATH_MAX, но согласно POSIX для этой константы не гарантируется, что она определена , если система не имеет такого ограничения.

ПРИМЕР

Следующая программа динамически выделяет буфер, необходимый readlink(), из информации, предоставленной lstat() и проверяет, что при работы вызовов не возникло состязательности.

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{

struct stat sb;
char *linkname;
ssize_t r;
if (argc != 2) {
fprintf(stderr, "Использование: %s <путь>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (lstat(argv[1], &sb) == -1) {
perror("lstat");
exit(EXIT_FAILURE);
}
linkname = malloc(sb.st_size + 1);
if (linkname == NULL) {
fprintf(stderr, "недостаточно памяти\n");
exit(EXIT_FAILURE);
}
r = readlink(argv[1], linkname, sb.st_size + 1);
if (r < 0) {
perror("lstat");
exit(EXIT_FAILURE);
}
if (r > sb.st_size) {
fprintf(stderr, "ссылка увеличилась в размере "
"между lstat() и readlink()\n");
exit(EXIT_FAILURE);
}
linkname[sb.st_size] = '\0';
printf("'%s' указывает на '%s'\n", argv[1], linkname);
exit(EXIT_SUCCESS); }

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

readlink(1), lstat(2), readlinkat(2), stat(2), symlink(2), path_resolution(7), symlink(7)

2011-09-20 Linux