lock.l_len = sizeof(struct employee); /* Блокировать одну запись */
Используя SEEK_CUR
SEEK_END, вы можете заблокировать участки, начиная от текущего смещения в файле или относительно конца файла соответственно. Для этих двух случаев l_start может быть отрицательным, пока абсолютное начало не меньше нуля. Таким образом, чтобы заблокировать последнюю запись в файле:/* Заблокировать запись последнего сотрудника */
lock.l_whence = SEEK_END; /* Относительно EOF */
lock.l_start = -1 * sizeof (struct employee);
/* Начало последней структуры */
lock.l_len = sizeof(struct employee); /* Заблокировать одну запись */
Установка l_len
l_start и l_whence, и до конца файла. Сюда входят также любые области за концом файла. (Другими словами, если заблокированный файл увеличивается в размере, область блокировки расширяется таким образом, чтобы продолжать охватывать весь файл.) Таким образом, блокирование всего файла является вырожденным случаем блокирования одной записи:lock.l_whence = SEEK_SET; /* Абсолютное положение */
lock.l_start = 0; /* Начало файла */
lock.l_len = 0; /* До конца файла */
Справочная страница
POSIX 1003.1-2001 допускает отрицательные значения l_len
l_start + l_len вплоть до l_start - 1 включительно.) Однако, в этой ситуации системный вызов Linux для современных ядер возвращает EINVAL.(Мы заметили, что справочная страница относится к версиям ядер 2.4.x; стоит проверить текущую справочную страницу, если ваша система новее.)
Теперь, когда мы знаем, как описать
l_type. Возможные значения следующие:F_RDLCK
F_WRLCK
F_UNLCK
Таким образом, полная спецификация блокировки включает установку в структуре struct flock
Значение F_UNLCK
l_type снимает блокировку. В общем, это простейший способ снять те самые блоки, которые были установлены ранее, но можно «расщепить» блок, освободив диапазон байтов в середине ранее установленного более крупного блока. Например:struct employee { /* что угодно */ }; /* Описание сотрудника */
struct flock lock; /* Структура блока */
...
/* Заблокировать сотрудников 6-8 */
lock.l_whence = SEEK_SET; /* Абсолютное положение */
lock.l_start = 5 * sizeof(struct employee); /* Начало 6-й структуры */
lock.l_len = sizeof(struct employee) * 3; /* Заблокировать 3 записи */
/* ...установка блокировки (см. следующий раздел)... */
/* Освобождение записи 7: предыдущий блок расщепляется на два: */
lock.l_whence = SEEK_SET; /* Абсолютное положение */
lock.l_start = 6 * sizeof(struct employee); /* Начало 7-й структуры */
lock.l_len = sizeof(struct employee) * 1; /* Разблокирование 1-й записи */
/* ...снятие блокировки (см. следующий раздел)... */
14.2.2.2. Установка и снятие блокировок
После заполнения структуры struct flock
cmd функции fcntl():F_GETLK
F_SETLK