Книга: Программирование для 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, можно повторить показанный выше пример на двух разных машинах.

Оглавление книги


Генерация: 3.502. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз