Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

int posix_memalign(void **memptr, size_t alignment, size_t size);

 /* POSIX ADV */

void *memalign(size_t boundary, size_t size); /* Обычная */

posix_memalign
является более новой функцией; она является частью другого необязательного расширения, «Консультативной информации» («Advisory Information»). Работа функции отличается от других функций выделения памяти Linux. При наличии проблемы она не возвращает -1. Вместо этого возвращаемое значение равно 0 при успехе или значению
errno
в случае неудачи. Аргументы следующие:

void **memptr

Указатель на переменную

void*
. Указываемая переменная будет содержать адрес выделенного блока памяти. Выделенная память освобождается с помощью
free
.

size_t alignment

Требуемое выравнивание. Оно должно быть кратно

sizeof(void*)
и быть степенью двойки.

size_t size

Число выделяемых байтов.

memalign
является нестандартной, но широко доступной функцией, которая работает сходным образом. Возвращаемое значение равно
NULL
в случае неудачи и запрошенному блоку памяти при успехе, причем
boundary
(степень двойки) обозначает выравнивание, a
size
— затребованный размер памяти.

Традиционно выделенная

memalign
память не могла быть освобождена с помощью
free
, поскольку
memalign
использовала для выделения памяти
malloc
и возвращала указатель на выровненный подходящим образом байт где-то внутри блока. Версия GLIBC не имеет этой проблемы. Из этих двух функций следует использовать
posix_memalign
, если она у вас есть.

14.2. Блокировка файлов

Современные системы Unix, включая GNU/Linux, дают вам возможность заблокировать часть файла или весь файл для чтения или записи. Подобно многим частям Unix API, которые были разработаны после V7, имеется несколько несовместимых способов осуществить блокировку файлов. Данный раздел рассматривает эти возможности.

14.2.1. Концепции блокировки файлов

Также, как замок на вашей двери предотвращает нежелательные проникновения в ваш дом, блокировка файла предотвращает доступ к данным в файле. Блокировка файлов была добавлена в Unix после разработки V7 (от которой происходят все современные системы Unix), и соответственно в течение некоторого времени в различных системах Unix были доступны и использовались несколько несовместимых механизмов блокировки файлов. Как в BSD Unix, так и в System V были собственные несочетающиеся вызовы для блокировки. В конечном счете POSIX формализовал способ осуществления блокировки файлов System V. К счастью, названия функций в System V и BSD были различны, так что GNU/Linux, в попытке угодить всем, поддерживает обе разновидности блокировок.

Табл. 14.1 суммирует различные виды блокировок.

Таблица 14.1. Функции блокировки файлов

Источник Функция Диапазон Весь файл Чтение/запись Вспомогательный Обязательный
BSD
flock
POSIX
fcntl
POSIX
lockf

Имеются следующие аспекты блокировки файлов:

Блокировка записей

Блокировка записи является блокировкой части файла. Поскольку файлы Unix являются просто потоками байтов, было бы корректнее использовать термин блокировка диапазона (range lock), поскольку осуществляется блокировка диапазона байтов. Тем не менее, термин «блокировка записей» общеупотребительный.

Блокировка всего файла

Блокировка всего файла, как предполагает название, блокирует весь файл, даже если его размер меняется в блокированном состоянии. Интерфейс BSD предусматривает блокирование лишь всего файла. Для блокирования всего файла с использованием интерфейса POSIX указывают нулевую длину. Это интерпретируется особым образом как «весь файл».

Блокировка чтения

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

Блокировка записи

Блокировка записи предоставляет исключительный доступ к записываемой области. Если эта область заблокирована также и для чтения, попытка получения блокировки записи либо блокируется, либо завершается неудачей в зависимости от запрошенного типа блокировки. После получения блокировки записи попытка получить блокировку чтения завершается неудачей.

Вспомогательная блокировка

Вспомогательная блокировка (advisory lock) тесно соответствует замку на двери. Говорят, «замки существуют для честных людей», что означает, что если кто-нибудь на самом деле захочет вломиться в ваш дом, он, возможно, найдет способ это сделать, несмотря на наличие замка в двери. То же и со вспомогательной блокировкой; она работает лишь тогда, когда тот, кто пытается получить доступ к заблокированному файлу, сначала пытается получить блокировку. Однако, программа может совершенно игнорировать вспомогательные блокировки и делать с файлом, что захочет (конечно, пока это разрешается правами допуска файла).

Обязательная блокировка

Обязательная блокировка является более строгой: когда установлена обязательная блокировка, ни один другой процесс не может получить доступ к заблокированному файлу. Любой процесс, который пытается игнорировать это, либо сам блокируется до снятия блокировки файла, либо его попытка завершится неудачей. (Под GNU/Linux по крайней мере это включает

root
!)

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

POSIX стандартизует лишь вспомогательную блокировку. Обязательная блокировка доступна на GNU/Linux, а также в ряде коммерческих систем Unix, но детали варьируют. Далее в данном разделе мы рассмотрим детали для GNU/Linux.

14.2.2. Блокировка POSIX:

fcntl
и
lockf

Системный вызов

fcntl
(file control — управление файлом) используется для блокировки файла. (Другое использование
fcntl
было описано в разделе 9.4.3 «Управление атрибутами файла:
fcntl
».) Он объявлен следующим образом:

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

Эволюционер из трущоб. Том 4

Панарин Антон
4. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 4

Безмолвная

Герритсен Тесс
9. Джейн Риццоли и Маура Айлс
Детективы:
триллеры
8.81
рейтинг книги
Безмолвная

Warhammer: Битвы в Мире Фэнтези. Омнибус. Том 2

Коллектив авторов
Warhammer Fantasy Battles
Фантастика:
фэнтези
5.00
рейтинг книги
Warhammer: Битвы в Мире Фэнтези. Омнибус. Том 2

Игры патриотов

Клэнси Том
1. Джек Райан
Детективы:
триллеры
6.86
рейтинг книги
Игры патриотов

Беседы

Агеев Александр Иванович
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Беседы

Костры амбиций

Вулф Том
21. Иллюминатор
Проза:
современная проза
7.43
рейтинг книги
Костры амбиций

Право на жизнь

Арно Сергей Игоревич
Фантастика:
ужасы и мистика
7.17
рейтинг книги
Право на жизнь

Цикл "Отмороженный". Компиляция. Книги 1-14

Гарцевич Евгений Александрович
Отмороженный
Фантастика:
боевая фантастика
рпг
постапокалипсис
5.00
рейтинг книги
Цикл Отмороженный. Компиляция. Книги 1-14

Полное собрание стихотворений

Брюсов Валерий Яковлевич
Поэзия:
поэзия
7.00
рейтинг книги
Полное собрание стихотворений

Воин

Бубела Олег Николаевич
2. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.25
рейтинг книги
Воин

Осколки чести

Буджолд Лоис Макмастер
1. Сага о Форкосиганах
Фантастика:
космическая фантастика
9.34
рейтинг книги
Осколки чести

Обрыв

Гончаров Иван Александрович
Проза:
классическая проза
русская классическая проза
8.93
рейтинг книги
Обрыв

Эпоха Опустошителя. Том IX

Павлов Вел
9. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том IX

Старплекс. Конец эры (сборник)

Сойер Роберт Джеймс
Шедевры фантастики
Фантастика:
научная фантастика
6.25
рейтинг книги
Старплекс. Конец эры (сборник)