Вывод программы lockit может выглядеть
fcntl (fd, F_SETLKW, longint(@my_lock));
if linuxerror > 0 then
begin
perror ('parent: locking');
halt (1);
end;
writeln('Родительский процесс: блокировка установлена');
case fork of
-1: (* ошибка *)
begin
perror ('Ошибка вызова fork');
halt (1);
end;
0:
begin
my_lock.l_len := 5;
fcntl (fd, F_SETLKW, longint(@my_lock));
if linuxerror > 0 then
begin
perror ('Дочерний процесс: установка блокировки');
halt (1);
end;
writeln ('Дочерний процесс: блокировка установлена');
writeln ('Дочерний процесс: выход');
halt (0);
end;
end;
(* родительский процесс *)
sleep (5);
(* Выход, который автоматически снимет блокировку. *)
writeln ('Родительский процесс: выход');
halt (0);
end.
Вывод программы lockit может выглядеть примерно так:
Родительский процесс: блокировка установлена
Родительский процесс: выход
Дочерний процесс: блокировка установлена
Дочерний процесс: выход
Обратите внимание на порядок, в котором выводятся сообщения. Он показывает, что дочерний процесс не может наложить блокировку до тех пор, пока родительский процесс не завершит работу и не снимет тем самым блокировку, в противном случае сообщение Дочерний процесс: блокировка установлена появилось бы вторым, а не третьим. Этот пример показывает, что блокировка, наложенная родительским процессом, также затронула и дочерний, хотя блокируемые участки файла и не совсем совпадали. Другими словами, попытка блокировки завершится неудачей, даже если участок файла лишь частично перекрывает уже заблокированный. Эта программа иллюстрирует несколько интересных моментов. Во-первых, блокировка информации не наследуется при вызове fork; дочерний и родительский процессы в данном примере выполняют блокировку независимо друг от друга. Во-вторых, вызов fcntl не изменяет положение указателя чтения-записи файла – во время выполнения обоих процессов он указывает на начало файла. В-третьих, все связанные с процессом блокировки автоматически снимаются при его завершении.
Содержание Назад Вперед