Назад |
Процессы могут разделять один и тот же открытый файл. Для исключения конфликтов, возникающих при попытке одновременной записи в одно и то же место в нем, применяется механизм блокировки. Процесс может блокировать файл целиком или отдельную его часть (запись). Под записью здесь подразумевается непрерывная область набора данных с указанными началом и длиной.
Перед выполнением операции записи в файл, процесс должен проверить, не блокирована ли запись, в которую предполагается поместить новые данные. Если область блокирована другим процессом, первый должен ждать ее освобождения. Затем надо блокировать запись и произвести операцию вывода. По завершении действий блокировка отменяется, давая другим процессам возможность записывать свои данные в этот файл. Для выполнения операции чтения блокировку можно не делать.
Для блокирования записи используется системный вызов lockf( ):
#include <unistd.h> int lockf (int fd, int function, long size);
Здесь fd - дескриптор файла. Аргумент function задает выполняемую операцию и может принимать следующие значения:
F_ULOCK | - отменить предыдущую блокировку; |
F_LOCK | - блокировать запись; |
F_TLOCK | - блокировать запись с проверкой, не блокирована ли она другим процессом; |
F_TEST | - проверить, не блокирована ли запись другим процессом. |
Начало записи определяется текущим положением указателя в файле. Длина записи задается аргументом size. При неудачной попытке блокирования записи функция возвращает в качестве своего значения (-1).
Обмен данными между процессами через разделяемые файлы имеет ряд недостатков. Основным из них является то, что операции записи и чтения в файлы на диске требуют для своего выполнения гораздо больше времени, чем перемещение данных в оперативной памяти.