Работа с символическими ссылками — КиберПедия 

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Работа с символическими ссылками

2021-01-29 91
Работа с символическими ссылками 0.00 из 5.00 0 оценок
Заказать работу

 

В общем, символические ссылки ведут себя подобно прямым ссылкам; файловые операции, такие, как и, применяются к указываемому файлу вместо самой символической ссылки. Однако, бывают моменты, когда в самом деле необходимо работать с символической ссылкой вместо файла, на которую она указывает.

По этой причине существует системный вызов. Он действует точно также, как, но если проверяемый файл окажется символической ссылкой, возвращаемые сведения относятся к символической ссылке, а не к указываемому файлу. А именно:

• будет.

• содержит число байтов в имени указываемого файла.

Мы уже видели, что системный вызов создает символическую ссылку. Но если дана существующая символическая ссылка, как можно получить имя файла, на которую она указывает? (Очевидно, может получить это имя; поэтому мы должны быть способны это сделать.)

Открывание ссылки с помощью для чтения ее с использованием не будет работать, следует по ссылке на указываемый файл. Таким образом, символические ссылки сделали необходимым дополнительный системный вызов, который называется:

 

 помещает содержимое символической ссылки, на имя которой указывает, в буфер, на который указывает. Копируется не более символов. Возвращаемое значение равно числу символов, помещенных в, либо ‑1, если возникла ошибка, не вставляет завершающий нулевой байт.

Обратите внимание, что если буфер, переданный, слишком маленький, информация будет потеряна; полное имя указываемого файла будет недоступно. Чтобы использовать должным образом, вы должны делать следующее:

1. Используйте, чтобы убедиться, что это символическая ссылка.

2. Убедитесь, что ваш буфер для содержимого символической ссылки составляет по крайней мере '' байтов; '' нужно для завершающего нулевого байта, чтобы сделать буфер годной к употреблению строкой С.

3. Вызовите. Не мешает проверить, что возвращенное значение равно.

4. Добавьте '' к байту после содержимого ссылки, чтобы превратить его в строку С. Код для всего этого мог бы выглядеть примерно так:

 

Данный пример для простоты представления использует буферы фиксированного размера. Реальный код мог бы использовать для выделения буфера нужного размера, поскольку массивы фиксированного размера могли бы оказаться слишком маленькими. Файл в GNU Coreutils делает именно это. Он читает содержимое символической ссылки в память, выделенную. Мы покажем здесь саму функцию, большая часть файла представляет собой стереотипные определения. Номера строк относятся к началу файла:

 

 

Тело функции состоит из бесконечного цикла (строки 68–91), разрываемого в строке 84, которая возвращает выделенный буфер. Цикл начинается выделением первоначального буфера (строка 70) и чтения ссылки (строка 71). Строки 73–79 обрабатывают случай ошибки, сохраняя и восстанавливая errno таким образом, что она может корректно использоваться вызывающим кодом.

Строки 81–85 обрабатывают случай «успеха», при котором размер содержимого ссылки меньше размера буфера. В этом случае добавляется завершающий ноль (строка 83), а затем буфер возвращается, прерывая бесконечный цикл. Это гарантирует, что в буфер помещено все содержимое ссылки, поскольку у нет возможности сообщить о «недостаточном размере буфера».

Строки 87–88 освобождают буфер и удваивают размер буфера для следующей попытки в начале цикла. Строки 89–90 обрабатывают случай, при котором размер ссылки слишком велик: больше, чем, или больше, чем значение, которое может быть представлено в знаковом целом того же размера, который использовался для хранения, и обернулся в ноль. (Это маловероятные условия, но странные вещи все же случаются.) Если одно из этих условий верно, программа завершается с сообщением об ошибке. В противном случае функция возвращается в начало цикла, чтобы сделать еще одну попытку выделить буфер и прочесть ссылку.

Некоторое дополнительное разъяснение: условие '' верно лишь на системах, в которых ''; мы не знаем таких, но лишь на таких системах может обернуться в ноль. Поскольку на практике это условие не может быть истинным, компилятор может оптимизировать все выражение, включив следующую проверку ''. После прочтения этого кода вы можете спросить: «Почему не использовать для получения размера символической ссылки, не выделить буфер нужного размера с помощью, и все?» На это есть несколько причин.[61]

• является системным вызовом – лучше избежать накладных расходов по его вызову, поскольку содержимое большинства символических ссылок поместится в первоначальный размер буфера в 128.

• Вызов создает условие состязания: ссылка может измениться между исполнением и, в любом случае вынуждая повторение.

• Некоторые системы не заполняют должным образом член для символической ссылки. (Печально, но верно.) Сходным образом, как мы увидим в разделе 8.4.2 «Получение текущего каталога:», Linux в предоставляет специальные символические ссылки, у которых равен нулю, но для которых возвращает действительное содержимое.

Наконец, буфер не слишком большой, использует и с большим размером вместо, чтобы избежать бесполезного копирования, которое делает. (Поэтому комментарий в строке 58 устарел, поскольку не используется; это исправлено в версии Coreutils после 5.0.)

 

 


Поделиться с друзьями:

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.011 с.