Назад

Содержание

Вперед


1.7.1. Разделяемые файлы.

    Процессы могут разделять один и тот же открытый файл. Для исключения конфликтов, возникающих при попытке одновременной записи в одно и то же место в нем, применяется механизм блокировки. Процесс может блокировать файл целиком или отдельную его часть (запись). Под записью здесь подразумевается непрерывная область набора данных с указанными началом и длиной.

    Перед выполнением операции записи в файл, процесс должен проверить, не блокирована ли запись, в которую предполагается поместить новые данные. Если область блокирована другим процессом, первый должен ждать ее освобождения. Затем надо блокировать запись и произвести операцию вывода. По завершении действий блокировка отменяется, давая другим процессам возможность записывать свои данные в этот файл. Для выполнения операции чтения блокировку можно не делать.

    Для блокирования записи используется системный вызов lockf( ):

#include <unistd.h>

int lockf (int fd, int function, long size);

    Здесь fd - дескриптор файла. Аргумент function задает выполняемую операцию и может принимать следующие значения:

F_ULOCK - отменить предыдущую блокировку;
F_LOCK - блокировать запись;
F_TLOCK - блокировать запись с проверкой, не блокирована ли она другим процессом;
F_TEST - проверить, не блокирована ли запись другим процессом.

     Начало записи определяется текущим положением указателя в файле. Длина записи задается аргументом size. При неудачной попытке блокирования записи функция возвращает в качестве своего значения (-1).

    Обмен данными между процессами через разделяемые файлы имеет ряд недостатков. Основным из них является то, что операции записи и чтения в файлы на диске требуют для своего выполнения гораздо больше времени, чем перемещение данных в оперативной памяти.