Книга: Разработка приложений в среде Linux. Второе издание
11.4.3. Использование символических ссылок
11.4.3. Использование символических ссылок
Символические ссылки — это более гибкий тип ссылок, чем жесткие, но они не дают равноправного доступа к файлу, как это делают жесткие. В то время как жесткие ссылки разделяют один и тот же inode, символические ссылки просто указывают на другие имена файлов. Если файл, на который указывает символическая ссылка, удаляется, то она указывает на несуществующий файл, что приводит к появлению висячих ссылок. Использование символических ссылок между подкаталогами — обычная практика, и они могут также пересекать границы физических систем, чего не могут жесткие ссылки.
Почти все системные вызовы, которые обращаются к файлам по путевым именам, автоматически следуют по символическим ссылкам для поиска правильного inode. Ниже перечислены вызовы, которые не следуют по символическим ссылкам.
• chown()
• lstat()
• readlink()
• rename()
• unlink()
Символически ссылки создаются почти так же, как жесткие, но при этом используется системный вызов symlink()
.
#include <unistd.h>
int symlink(const char *origpath, const char *newpath);
Если вызов успешен, создается файл newpath
как символическая ссылка, указывающая на oldpath
(часто говорят, что newpath
содержит в качестве своего значения oldpath
).
Поиск значения символической ссылки немного сложнее.
#include <unistd.h>
int readlink(const char *pathname, char *buf, size_t bufsiz);
Буфер, на который указывает buf
, наполняется содержимым символической ссылки pathname
до тех пор, пока хватает длины buf
, указанной в bufsize
в байтах. Обычно константы PATH_MAX
применяется в качестве размера буфера, поскольку она должна быть достаточно большой, чтобы уместить содержимое любой символической ссылки[49]. Одна странность функции readlink()
связана с тем, что она не завершает строку, которую записывает в buf
, символом ''
, поэтому buf
не содержит корректную строку С, даже если readlink()
выполняется успешно. Вместо этого она возвращает количество байт, записанных в buf
в случае успеха и -1
— при неудаче. Из-за этой особенности код, использующий readlink()
, часто выглядит так, как показано ниже.
char buf[PATH_MAX + 1];
int bytes;
if ( (bytes = readlink (pathname, buf, sizeof (buf) - 1)) < 0) {
perror("ошибка в readlink");
} else {
buf[bytes]= '';
}
- Восстановление с использованием инструмента gbak
- Типы страниц и их использование
- Использование констант
- Использование переменной окружения ISC_PATH
- Использование сервера Yaffil внутри процесса
- Использование CAST() с типами дата
- Использование типов содержимого и столбцов
- Вызов хранимых процедур InterBase с использованием стандартного синтаксиса ODBC
- Использование кнопки Автосумма
- 24.7. Использование программы-твикера
- Использование отдельных процессоров XSLT
- Покупка ссылок