table of contents
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():
ОПИСАНИЕ¶
readlink() помещает содержимое символьной ссылки path в буфер buf размером bufsiz. readlink() не добавляет в buf байт null.Если буфер слишком мал для хранения всего содержимого, то содержимое будет урезано (до длины в bufsiz символов).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном выполнении readlink() возвращает количество байт, помещённых в buf. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
ОШИБКИ¶
- EACCES
- В одном из каталогов префикса пути не разрешён поиск (см. также path_resolution(7).
- EFAULT
- buf выходит за пределы адресного пространства, выделенного процессу.
- EINVAL
- Аргумент bufsiz содержит отрицательное значение.
- EINVAL
- Указанный файл не является символьной ссылкой.
- EIO
- При чтении файловой системы произошла ошибка ввода-вывода.
- ELOOP
- Во время определения pathname встретилось слишком много символьных ссылок.
- ENAMETOOLONG
- Слишком длинное значение аргумента pathname или его части.
- ENOENT
- Указанный файл не существует.
- ENOMEM
- Недостаточное количество памяти ядра.
- ENOTDIR
- Компонент в префиксе пути не является каталогом.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
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 |