Страница 206 из 253
#include <stdlib.h>
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 при успехе или значению <i>errno</i> в случае неудачи. Аргументы следующие:
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. Функции блокировки файлов