Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

67: }

68:

69: /* если создается именованный канал, то финальный параметр

70: игнорируется */

71: if (mknod(path, mode, makedev(major, minor))) {

72: fprintf(stderr, "вызов mknod не удался : %s\n", strerror(errno));

73: return 1;

74: }

75:

76: return 0;

77: }

11.4.2. Создание жестких ссылок

Когда множество имен файлов в файловой системе ссылаются на единственный inode, такие файлы называют жесткими ссылками (hard links) на него. Все эти имена должны располагаться на одном физическом носителе (обычно это значит, что они должны быть на одном устройстве). Когда файл имеет множество жестких ссылок, все они равны — нет способа узнать, с каким именем первоначально был создан файл. Одно из преимуществ такой модели заключается в том, что удаление одной жесткой ссылки не удаляет файл с устройства — он остается до тех пор, пока все ссылки на него не будут удалены. Системный вызов

link
связывает новое имя файла с существующим inode.

#include <unistd.h>

int link(const char *origpath, const char *newpath);

Параметр

origpath
ссылается на существующее путевое имя, a
newpath
представляет собой путь для новой жесткой ссылки. Любой пользователь может создавать ссылку на файл, к которому у него есть доступ по чтению, до тех пор, пока он имеет право записи в каталоге, в котором ссылка создается, и право выполнения в каталоге, в котором находится
origpath
. Только пользователь root имеет право создавать жесткие ссылки на каталоги, но поступать так — обычно плохая идея, поскольку большинство файловых систем и некоторые утилиты не работают с ними достаточно хорошо — они полностью их отвергают.

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
, символом
'\0'
, поэтому
buf
не содержит корректную строку С, даже если
readlink
выполняется успешно. Вместо этого она возвращает количество байт, записанных в
buf
в случае успеха и
– 1
— при неудаче. Из-за этой особенности код, использующий
readlink
, часто выглядит так, как показано ниже.

49

Хотя не гарантировано, что

PATH_MAX
будет достаточно велик, но для большинства практических целей она подходит. Если вы имеете дело с патологическими случаями, то должны вызывать
readlink
последовательно, увеличивая буфер, до тех пор, пока
readlink
не вернет значение меньше чем
bufsiz
.

char buf[PATH_MAX + 1];

int bytes;

if ( (bytes = readlink (pathname, buf, sizeof (buf) - 1)) < 0) {

 perror("ошибка в readlink");

} else {

 buf[bytes]= '\0';

}

11.4.4. Удаление файлов

Удаление файла — это удаление указателя на его inode и удаление содержимого файла, если не остается ни одой жесткой ссылки на него. Если любой процесс держит файл открытым, то inode этого файла предохраняется до тех пор, пока финальный процесс не закроет его, после чего и inode, и содержимое файла уничтожаются. Поскольку нет способа принудительно удалить файл немедленно, эта операция называется разъединением (unlinking) файла, поскольку она удаляет связь между именем файла и inode.

  • Читать дальше
  • 1
  • ...
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: