Книга: Программирование для Linux. Профессиональный подход
Листинг 8.2. (lock-file.c) Установка блокировки записи с помощью функции fcntl()
Листинг 8.2. (lock-file.c) Установка блокировки записи с помощью функции fcntl()
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
char* file = argv[1];
int fd;
struct flock lock;
printf("opening %sn", file);
/* Открытие файла. */
fd = open(file, O_WRONLY);
printf("lockingn");
/* инициализация структуры flock. */
memset(&lock, 0, sizeof(lock));
lock.l_type = F_WRLCK;
/* Установка блокировки записи. */
fcntl(fd, F_SETLKW, &lock);
printf("locked; hit Enter to unlock... ");
/* Ожидание нажатия клавиши <Enter>. */
getchar();
printf("unlockingn");
/* Снятие блокировки. */
lock.l_type = F_UNLCK;
fcntl(fd, F_SETLKW, &lock);
close(fd);
return 0;
}
Скомпилируйте программу и запустите ее с каким-нибудь тестовым файлом, скажем, /tmp/test-file
:
% cc -o lock-file lock-file.с
% touch /tmp/test-file
% ./lock-file /tmp/test-file
opening /tmp/test-file
locking
locked; hit Enter to unlock...
Теперь откройте другое окно и вызовите программу еще раз с тем же файлом:
% ./lock-file /tmp/test-file
opening /tmp/test-file
locking
Пытаясь поставить блокировку на файл, программа сама окажется заблокированной. Вернитесь в первое окно и нажмите <Enter>:
unlocking
В результате программа, запущенная во втором окне, немедленно продолжит свою работу. Если необходимо, чтобы функция fcntl()
не переходила в режим ожидания в случае, когда блокировку поставить невозможно, задайте в качестве кода операции константу F_SETLCK
, а не F_SETLKW
. Если функция обнаружит, что запрашиваемый файл уже заблокирован, она немедленно вернет -1.
В Linux имеется системный вызов flock()
, также реализующий операцию блокирования файла. Но у функции fcntl()
есть большое преимущество: она работает с файловыми системами NFS[28] (при условии, что сервер NFS имеет относительно недавнюю версию и сконфигурирован правильно). Так что. имея доступ к двум компьютерам, которые монтируют одну и ту же файловую систему через NFS, можно повторить показанный выше пример на двух разных машинах.
- Расширенная установка InterBase-сервера
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Повышение производительности приложений с помощью хранимых процедур
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Shared Cache file
- Организация пользователей в группы с помощью ролей
- Ограничение времени ожидания для транзакций (Lock timeout)
- Аргументы функции в Python
- 3. Функции
- Новые функции API для работы с Blob и массивами
- Безопасность внешних таблиц. Параметр EXTERNAL FILE DIRECTORY
- LOCK_MEM_SIZE