Системное программирование в UNIX средствами Free Pascal

       

Снятие блокировки при помощи вызова fcntl


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

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

Например, в предыдущей программе lockit родительский процесс снял блокировку в момент выхода из программы, но вместо этого он мог осуществить эту операцию при помощи следующего кода:

(* Родительский процесс снимает блокировку перед выходом *)

writeln('Родительский процесс: снятие блокировки');

my_lock.l_type := F_UNLCK;

fcntl(fd, F_SETLK, longint(@my_lock));

if linuxerror <> 0 then

begin

  perror('ошибка снятия блокировки в родительском процессе');

  halt(1);

end;



Содержание раздела