•
S_ISLNK(sbuf.st_mode)
будет
true
.
•
sbuf.st_size
содержит число байтов в имени указываемого файла.
Мы уже видели, что системный вызов
symlink()
создает символическую ссылку. Но если дана существующая символическая ссылка, как можно получить имя файла, на которую она указывает? (Очевидно,
ls
может получить это имя; поэтому мы должны быть способны это сделать.)
Открывание ссылки с помощью
open()
для чтения ее с использованием
read()
не будет работать,
open()
следует по ссылке на указываемый файл. Таким образом, символические ссылки сделали необходимым дополнительный системный вызов, который называется
readlink()
:
#include <unistd.h> /* POSIX */
int readlink(const char *path, char *buf, size_t bufsiz);
readlink()
помещает содержимое символической ссылки, на имя которой указывает
path
, в буфер, на который указывает
buf
. Копируется не более
bufsiz
символов. Возвращаемое значение равно числу символов, помещенных в
buf
, либо -1, если возникла ошибка,
readlink()
не вставляет завершающий нулевой байт.
Обратите внимание, что если буфер, переданный
readlink()
, слишком маленький, информация будет потеряна; полное имя указываемого файла будет недоступно. Чтобы использовать
readlink()
должным образом, вы должны делать следующее:
1. Используйте
lstat()
, чтобы убедиться, что это символическая ссылка.
2. Убедитесь, что ваш буфер для содержимого символической ссылки составляет по крайней мере '
sbuf.st_size + 1
' байтов; '
+ 1
' нужно для завершающего нулевого байта, чтобы сделать буфер годной к употреблению строкой С.
3. Вызовите
readlink()
. Не мешает проверить, что возвращенное значение равно
sbuf.st_size
.
4. Добавьте '